对布尔值的读/写保证是C/C++中的一条指令
Is read/write of a bool value guaranteed to be one instruction in C/C++
我无法想象一个体系结构会在多条指令中设计对其最小数据类型的访问,但也许流水线存在一些我没有考虑的问题?
是否在单个操作中读取和写入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的语言一起使用。
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 如何在 Win32 中用一条线连接 2 个文本框?
- C++ 如何在同一行中和在一条线上?
- 如何在SDL2窗口上使用Cairo绘制一条白色直线
- 在Opengl中绘制一条不显示C++的线
- 为什么当 while 循环中的 if 条件变为 false 时,我的函数不输出最后一条语句?
- x86 - 为什么编译器在下一条指令中插入看似毫无意义的JMP?
- CMake似乎忽略了一条线
- 在C 中使用Legacy OpenGL(即时模式)绘制一条厚线
- 在图像标签上画一条线并计算距离
- switch 语句结束和下一条语句之间的时间是否具有确定性(与路径无关)
- 如何在OMNET++中收到来自前一个模块的所有消息后将一条消息发送到下一个模块
- 一条线和两行声明之间的差异
- C++ OpenCV:检测两条线而不是一条线(Canny & findContours)
- 如何在C++中将边列表转换为邻接矩阵,其中包含连接到顶点的边数而不是一条边?
- 为什么 fstream 打印出文件的最后一条记录
- 如何在另一条消息(M1)之前调用带有消息(M2)的lambda函数,但输出要"M2 M1"?
- 如何在子小部件而不是父窗口小部件上绘制一条线
- 在C++中,文件中的下一条记录被非法更新
- MFC:在 CRichEditCtrl 中突出显示一条线一段时间,然后恢复