读取/写入bool值保证是C / C ++中的一条指令

时间:2012-03-06 14:49:28

标签: c++ c types

我无法想象一个架构会在多个指令中设计对其最小数据类型的访问,但是流水线可能存在一些我不考虑的问题?

3 个答案:

答案 0 :(得分:11)

C ++标准是否在单个操作中读取和写入bool对象 无法保证 ,因为这会对底层硬件施加约束,C和C ++试图最小化。

但请注意,在多线程方案中,读取/写入数据类型是 atomic 的问题只是问题的一半。另一半是对某些地址的更改 是否反映在所有缓存中 (即不同内核本地的那些),以及它们是否以相同顺序反映在所有线程中。为此你需要记忆障碍。

答案 1 :(得分:2)

不,不能保证。

C89和C99无法表达原子性。 C11有原子对象。

编译器通常提供具有原子性的扩展:例如gcc

http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html

更好的方法是使用pthreads库的一些原语。

答案 2 :(得分:0)

例如,您有2个使用相同数据的线程。

您的主题1必须如下所示。让名字为“i”:

while (true) {
           flag[i] = TRUE;
           turn = j;
           while ( flag[j] && turn == j);

                 CRITICAL SECTION

           flag[i] = FALSE;

                   REMAINDER SECTION

   }

你的主题2必须如下所示。我们将其命名为“j”:

while (true) {
           flag[j] = TRUE;
           turn = i;
           while ( flag[i] && turn == i);

                 CRITICAL SECTION

           flag[i] = FALSE;

                   REMAINDER SECTION

   }

标志变量控制每个线程的临界区的入口。

代码运行如下:

1-每个线程都希望通过将其标志设置为true来输入临界区。

2-例如线程“i”通过设置转弯将其传递给线程“j”。 turn变量存储进入临界区的线程。

3-因为转弯变量只能存储一个值。保证一个线程一次可以进入临界区。如果存在临界区,则没有其他线程可以进入临界区。

4-线程j看到标记点传递是它自己的并且想要进入。因此它可以进入关键部分。而线程我等待。

线程j运行后

4-。它通过确定自己不想输入临界区来设置其标志变量false。

5-线程我在while循环开始时被阻止了。

6-一旦线程j通过转动其开始转向其他线程。线程我进入关键部分。

此代码满足。互斥,进度和边界等待条件。

此代码可以运行支持线程的所有环境,并且可以与任何基于C语言一起使用。