当需要在多个线程进程间共享全局数据时,我通常使用线程令牌来保护共享资源:
编辑 – 2015年7月22日 (把primefaces作为一个可行的select,每延斯评论)
我的第一个问题是 ,在C中,如果我编写我的例程,以确保每个线程访问一个数组,并且只有一个数组元素:
是否有任何理由认为,asynchronous和同时访问同一个不受保护数组的不同索引 (如图所示)会是一个问题?
第二个问题:假设一个对象可以作为一个primefaces实体进行访问,即使存在asynchronous中断 ( C99 – 7.14信号处理 ),使用primefaces是保护其他未受保护variables的线程的有效方法?
编辑 (澄清解决问题的意见在这一点上):
– 这个应用程序的细节:
– 目标操作系统:Windows 7/8/10
– 编译器:符合C99(不能使用C11,包括_ Atomic()types说明符 )
– H / W:Intel i7系列
这(看起来像某种C标准) http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf说:
注1:两个执行线程可以更新和访问不同的存储单元,而不会相互干扰
注释13编译器转换引入了分配给可能共享的内存位置,这个位置不会被抽象机器修改,这个标准通常会被排除在外,因为在抽象机器执行的情况下,这样的分配可能会由另一个线程覆盖另一个分配没有遇到数据竞赛。 这包括数据成员分配的实现,其覆盖分开的存储位置中的相邻成员。 我们通常也排除原子载荷在别的情况下重新排序的原子载荷,因为这可能会违反“可见序列”规则。
我理解的方式,这将排除quamrana的担忧,并保证如果没有数据竞争,不受保护的写入单独的内存位置不应导致未定义的行为。
在C中,它将取决于你的平台,那就是你的编译器,处理器架构和操作系统的组合。
您的编译器可以选择如何使用内部寄存器和CPU的指令,使可执行文件似乎执行程序的意图。 而C可能对线程一无所知。 提供一个线程库通常是操作系统的工作。
可能有些处理器可能通过读取大于一个元素的内存块来执行对阵列元素的写入,然后覆盖在内部寄存器中形成一个元素的正确位,然后写回整个修补程序。 一个单线程的程序可以正常工作,但是两个或多个线程相互中断可能会导致数组混乱。
另一方面,它可能会工作得很好。
正如所说,只读访问总是很好。
另外,谷歌是你的朋友。 它发现这个stackoverflow的问题 。
如果每个线程正在访问不同的数组元素,并且只有它被“分配”的元素,这应该不成问题。 上述两种情况基本上是等价的,因为每个数组元素都有自己的地址。