C语言中的线程和线程安全

ryy*_*ker 8 c windows multithreading atomic c99

当存在需要在多个线程进程之间共享的公共全局数据集时,我通常使用线程令牌来保护共享资源:

在此输入图像描述

编辑 - 2015年7月22日(根据Jens评论将原子作为一种可行的选择)

我的[第一个]问题是,在C中,如果我以这样的方式编写我的例程,以保证每个线程访问一个,并且只访问一个数组的一个元素:

在此输入图像描述

有没有理由认为异步和同时访问同一个不受保护的数组的不同索引(如图所示)会有问题?

第二个问题:假设一个可以作为原子实体访问的对象,即使存在异步中断( C99 - 7.14信号处理),使用原子是一种有效的方法来保护线程,保护其他不受保护的变量吗?

在此输入图像描述

编辑(澄清以解决评论中的问题):
- 此应用程序的
细节:- 目标操作系统:Windows 7/8/10
- 编译器:符合C99(不能使用C11,包括_ Atomic()类型说明符 )
- H/W:Intel i7系列

PSk*_*cik 3

这(看起来像某种 C 标准) http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf说:

注 1:两个执行线程可以更新和访问单独的内存位置,而不会互相干扰

注 13:本标准通常排除将赋值引入到抽象机不会修改的潜在共享内存位置的编译器转换,因为在抽象机执行可能会发生错误的情况下,这样的赋值可能会覆盖不同线程的另一个赋值。没有遇到过数据竞争。这包括覆盖单独内存位置中的相邻成员的数据成员分配的实现。我们通常还会在相关原子可能别名的情况下排除原子加载的重新排序,因为这可能违反“可见序列”规则。

按照我的理解,这将排除 quamrana 的担忧,并保证您在没有数据争用的情况下,对单独内存位置的不受保护的写入永远不会导致未定义的行为。