C中可以同时执行两条语句吗?
Is it possible to execute two statements simultaneously in C?
通常在C语言中,我们将语句作为一个列表来对,当程序在运行时,它会一条一条地执行语句。是否可以让两条语句同时执行?
例如,假设我想交换两个变量 a
和 b
。通常我们会声明第三个变量 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;
通常在C语言中,我们将语句作为一个列表来对,当程序在运行时,它会一条一条地执行语句。是否可以让两条语句同时执行?
例如,假设我想交换两个变量 a
和 b
。通常我们会声明第三个变量 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;