对布尔值的读/写保证是C/C++中的一条指令

Is read/write of a bool value guaranteed to be one instruction in C/C++

本文关键字:C++ 一条 指令 布尔值      更新时间:2023-10-16

我无法想象一个体系结构会在多条指令中设计对其最小数据类型的访问,但也许流水线存在一些我没有考虑的问题?

是否在单个操作中读取和写入bool对象C++标准不能保证,因为这会对底层硬件造成限制,而C和C++试图将其最小化。

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

不,不能保证。

C89和C99没有表示原子性的手段。C11具有原子对象。

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

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

最好使用pthreads库的一些基元。

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

您的线程1必须如下所示。lets名称为"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
   }

flag变量控制每个线程的关键部分的入口。

代码运行方式如下:

1-每个线程都希望通过将其标志设置为true来进入关键部分。

2-例如,线程"i"通过设置turn将其传递给线程"j"。turn变量存储进入关键部分的线程。

3-因为turn变量只能存储一个值。保证一个线程一次可以进入关键部分。如果存在临界段,则没有其他线程可以进入临界段。

4-线程j看到标志点,该过程是它自己的并想要进入。因此可以进入临界段。线程i等待。

4-在线程j运行之后。它通过确定自己不想进入关键部分来设置其标志变量false。

5线程在while循环开始时我被卡住了。

6-只要螺纹j通过转动其起始处而将其转动到另一个螺纹。线程i进入关键部分。

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

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