多线程 - 我是否需要锁定读取数据?

时间:2010-07-13 23:10:47

标签: c++ multithreading

看看这段代码:

int data=5;

void Thread1()
{
    if(data==5)
    {
       //nothing
    }
}

void Thread2()
{
    if(data==2)
    {
       //nothing
    }
}

在这种情况下,我是否需要在if(data == ..)之前使用EnterCriticalSection / MutexLock?

5 个答案:

答案 0 :(得分:6)

如果您只是阅读数据,则无需锁定。

如果您正在编写数据 AND ,您关心的是订单数据被读取,那么您需要使用CS来确保订购正确。 (注意,如果对象具有在原子操作中未更新的更复杂的状态,那么您可能更关心读/写的顺序。)

答案 1 :(得分:1)

如果没有任何改变数据的话,那么在大多数架构中,不是没有。但如果没有任何改变数据的话,那么代码就毫无意义了。

答案 2 :(得分:1)

如果数据被另一个线程更改,那么在读取数据时需要一个内存栅栏以确保一致性。锁是实现内存栅栏的一种方法,但不一定是最佳方法。但是,除非您发现(通过测量!)锁定会大大减慢您的程序,否则可能不值得担心替代方案。

答案 3 :(得分:0)

如果您的示例已经完成,那么<​​strong>没有,您不必锁定或管理任何关键部分,因为您没有修改任何内容。

但是你的例子,就像它一样,它只是毫无意义..

当存在只读取普通数据的线程(可迭代数据结构上的内容不同)时,您不需要处理并发性,但只有当您拥有不需要更改的静态数据时,这才有用。一旦你只添加一个作者,你就必须确保在写入时没有人正在阅读,但如果没有作家正在进行其工作,每个人仍然可以与其他读者同时阅读。

答案 4 :(得分:0)

当你不修改共享内存时你不需要锁定,但是你的例子因为你初始化data而没有用,你检查它的值,但你永远不会修改它...第二个线程将完全无用。你在任何地方修改data变量吗?