C中可以同时执行两条语句吗?

Is it possible to execute two statements simultaneously in C?

通常在C语言中,我们将语句作为一个列表来对,当程序在运行时,它会一条一条地执行语句。是否可以让两条语句同时执行?

例如,假设我想交换两个变量 ab。通常我们会声明第三个变量 c.

c=b;
b=a;
a=b;

但是如果我们能够同时执行两个语句,那么我们就不需要第三个变量了c。我们可以同时执行 a=b;b=a;

那么,有没有办法同时执行两条或多条语句呢?

您可以在 C 中创建多个线程(使用 libpthreads),如果您有一个多核 CPU 线程可能会同时执行。

您的示例的问题在于数据相互依赖。您将创建一个 race condition

如果你想在没有中间变量的情况下交换两个变量,你可以使用 XOR swap algorithm,但它的效率低于简单地使用中间变量。

有多线程,但你说的是不可能的,因为这两个语句之间存在数据依赖性。

同时执行 2 永远不会给出合理的结果。

你可以做的是识别不同的独立程序部分,然后在不同的线程中执行它们。从程序员的角度来看,这就是您可以实现的并行级别。

So, is there a way to simultaneously execute two or more statements at the same time?

是的,通过多线程。

尽管如此,您需要同时有两个线程运行,才能达到这种效果。

一般情况下,我们不会要求同时执行的语句,这太难了,而且从中获得的收益根本不值得。


但是,在您的情况下,这会导致数据争用。


PS:你可以交换没有临时值的数字,就像我描述的那样here

语句 "when the program is run, it executes the statements one by one" 表明您从根本上误解了 C 编程语言。

C标准说编译后的程序需要执行,让程序的副作用按照抽象的规则as if these statements were executed in the C abstract machine顺序发生机器。但是,为非 volatile 变量赋值 不算作这种副作用 ,即在您的程序中

c = b;
b = a;
a = c; // notice, it is *c* here

因为 none 的语句有任何可见的副作用,编译器可以自由地重组、交错和消除这些语句,只要它不改变任何先前或后续的副作用或它们的相对顺序。

在实践中,任何体面的编译器都会注意到这是一个交换操作,它会使用 one 汇编程序操作码对其进行编码,例如 x86 XCHG 即使C编程语言本身没有交换操作。或者,可能是这些生成 zero 操作码,编译器只记住 "henceforth b shall be known as a and a as b."

真正强制编译器生成严格顺序执行每个语句的程序的唯一方法是,如果每个的语句涉及 volatile 限定的变量,因为访问 volatile 限定的对象被认为是副作用。

如果您的数据适合,使用 SIMD 指令可以并行(矢量化)同时执行多个语句。

示例:

a = e + g * ...
b = f + g * ...
c = e + g * ...
d = f + g * ...

无论您如何切片,CPU 都必须在 b 的值被 a 覆盖之前将其保存在一个临时位置,因此它可以被使用再次在分配回到另一个变量。即使是像 Python 这样允许你说 a,b=b,a 的语言,实际上也在幕后生成这些临时变量。

有些人在其他答案中提到 "threads"。在这一点上,鉴于您所问问题的性质,我强烈不建议您继续这样做。 (您还没有为线程做好准备!)使用线程进行简单的变量交换是非常不寻常的,并且在考虑更多竞争条件的情况下只会变慢。

如果您正在寻找一种 shorthand 的方式来表达 "swap",您总是可以定义自己的宏。

#define SWAP(x,y) {auto tmp=x; x=y; y=tmp;}

然后你可以用你自己的代码说:SWAP(a,b)

c 中的语句按顺序执行,除非并直到您在代码中使用 break 或 continue 标签。 您不能特别在您指定的示例中同时执行语句。 如果你不想使用临时变量,那么你可以使用这个逻辑。

a = a+b;
a = a-b;
b = a-b;