简单版:在C++程序中,我使用两个不同的线程来处理某个整数变量。但我确信其中一个总是在其中写入一些值,而另一个只是在读取这些值。在读/写数据时,我还需要使用互斥锁吗?
现在详细说明:主要思想是第一个线程生成一些信息并将它们保存到一个数组中,第二个线程从该数组中读取数据并处理它们。该数组表示一个队列。这意味着我有两个索引值,分别指向队列中的第一项和最后一项。现在我在想,当我读或写值时,是否必须锁定这两个索引值,或者可以不加锁地检查它们?请注意,生成器线程是唯一更改queue_back索引的线程,处理器线程具有更改queue_front的独占权限。
如果有任何变化,我正在为一个基于linux的系统开发,代码是用gcc编译的。
PS:在一些使用线程的代码中,我看到了在不同线程之间共享变量的关键字volatile,我也需要使用它吗?
发布于 2011-10-06 04:25:07
在大多数主流架构中,对齐正确的数据的读写不超过一个机器字(通常是int解析的任何内容)都是原子的。这并不意味着每个架构都是如此。
这意味着不,您不能仅仅读取head和tail并期望数据是一致的。但是,例如,如果sizeof(int)恰好是4,sizeof(short)恰好是2,如果你不关心“非主流”平台,你可以做一些联合的把戏,而不需要原子操作或互斥锁。
如果您希望您的代码是可移植的,那么就没有办法绕过适当的锁定或原子比较/交换。
关于volatile,这确实为Microsoft Visual C++插入了一个内存屏障(作为编译器特定的诡辩),但该标准不保证任何特殊的东西,除了编译器不会优化变量。就目前而言,创建volatile并没有多大帮助,而且它也不能保证线程安全。
https://stackoverflow.com/questions/7667077
复制相似问题