看看这段代码:
int data=5;
void Thread1()
{
if(data==5)
{
//nothing
}
}
void Thread2()
{
if(data==2)
{
//nothing
}
}
在这种情况下,我是否需要在if(data == ..)之前使用EnterCriticalSection / MutexLock?
答案 0 :(得分:6)
如果您只是阅读数据,则无需锁定。
如果您正在编写数据 AND ,您关心的是订单数据被读取,那么您需要使用CS来确保订购正确。 (注意,如果对象具有在原子操作中未更新的更复杂的状态,那么您可能更关心读/写的顺序。)
答案 1 :(得分:1)
如果没有任何改变数据的话,那么在大多数架构中,不是没有。但如果没有任何改变数据的话,那么代码就毫无意义了。
答案 2 :(得分:1)
如果数据被另一个线程更改,那么在读取数据时需要一个内存栅栏以确保一致性。锁是实现内存栅栏的一种方法,但不一定是最佳方法。但是,除非您发现(通过测量!)锁定会大大减慢您的程序,否则可能不值得担心替代方案。
答案 3 :(得分:0)
如果您的示例已经完成,那么<strong>没有,您不必锁定或管理任何关键部分,因为您没有修改任何内容。
但是你的例子,就像它一样,它只是毫无意义..
当存在只读取普通数据的线程(可迭代数据结构上的内容不同)时,您不需要处理并发性,但只有当您拥有不需要更改的静态数据时,这才有用。一旦你只添加一个作者,你就必须确保在写入时没有人正在阅读,但如果没有作家正在进行其工作,每个人仍然可以与其他读者同时阅读。
答案 4 :(得分:0)
当你不修改共享内存时你不需要锁定,但是你的例子因为你初始化data
而没有用,你检查它的值,但你永远不会修改它...第二个线程将完全无用。你在任何地方修改data
变量吗?