我的程序有两个线程和一个int全局变量。一个线程正在读取该变量,另一个线程在写入该变量。在这种情况下,我应该使用互斥锁吗。
在我的程序中,这些函数是从两个线程同时重复执行的。
void thread1()
{
if ( condition1 )
iVariable = 1;
else if ( condition2 )
iVariable = 2;
}
void thread2()
{
if ( iVariable == 1)
//do something
else if ( iVarable == 2 )
//do another thing
}
如果不使用任何同步,那么当第二个线程看到更新后的值时,这是完全不可预测的。这介于几纳秒和从不之间。当然,never的结果特别麻烦,当您没有声明变量volatile并运行程序的Release构建时,它可能会发生在x86处理器上。在内存模型较弱的处理器(如ARM内核)上,这可能需要很长时间。您唯一不必担心的是看到部分更新的值,int更新是原子的。
这就是关于发布代码的全部内容。细粒度锁定很少能很好地工作。
是的(在大多数情况下)。互斥将确保您正在保护的数据能够从多个竞争的CPU中正确可见。除非您有性能问题,否则应该使用互斥锁。如果性能是个问题,请查看无锁数据结构。