gpt4 book ai didi

c - C 中的线程和线程安全

转载 作者:可可西里 更新时间:2023-11-01 12:49:29 26 4
gpt4 key购买 nike

当有一组通用的全局数据需要在多个线程进程之间共享时,我通常使用线程 token 来保护共享资源:

enter image description here

Edit - 7/22/15(将 atomics 作为一个可行的选项,per延斯评论)

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

enter image description here

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

第二个问题:假设一个对象可以被访问为一个原子实体,即使存在异步中断 ( C99 - 7.14 Signal handling ) 也会使用 atomics 是一种有效的线程保护方法,用于保护未 protected 变量吗?

enter image description here

编辑(澄清以解决目前评论中的问题):
- 此应用程序的细节:
- 目标操作系统:Windows 7/8/10
- 编译器:C99 兼容(不能使用 C11,其中包括 _ Atomic() type specifier )
- 硬件:英特尔 i7 系列

最佳答案

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

NOTE 1 Two threads of execution can update and access separate memory locations without interfering with each other

NOTE 13 Compiler transformations that introduce assignments to a potentially shared memory location that would not be modified by the abstract machine are generally precluded by this standard, since such an assignment might overwrite another assignment by a different thread in cases in which an abstract machine execution would not have encountered a data race. This includes implementations of data member assignment that overwrite adjacent members in separate memory locations. We also generally preclude reordering of atomic loads in cases in which the atomics in question may alias, since this may violate the "visible sequence" rules.

按照我的理解,这将排除 quamrana 的顾虑,并向您保证,如果没有数据竞争,对单独内存位置的不 protected 写入永远不会导致未定义的行为。

关于c - C 中的线程和线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31548355/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com