2010-07-13 73 views
6

看看这个代码:多线程 - 我需要锁定读取数据吗?

int data=5; 

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

void Thread2() 
{ 
    if(data==2) 
    { 
     //nothing 
    } 
} 
在这种情况下

,做我需要使用EnterCriticalSection的/ MutexLock之前如果(数据= =)?

+0

就你而言,不,你不需要MutexLock。 – Siddiqui 2010-07-14 05:47:32

回答

6

如果您只是读取数据,则不需要锁。

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

+0

如果不关心订单,您仍然想要将变量更改为volatile,否? – Inverse 2010-07-14 07:00:20

+0

volatile的使用是依赖于多线程方面的编译器体系结构。阅读相应的文档。 – 2010-07-14 14:23:55

1

如果什么都不改变数据,那么在大多数架构上,没有。但如果没有任何数据发生变化,代码就没有意义了。

+0

这就是我的想法。 – GManNickG 2010-07-13 23:21:20

+6

在产生任何额外的线程之前初始化一些全局变量是非常有用的,并且从这一点开始数据是共享读取但不再被写入。 – 2010-07-13 23:41:02

0

如果您的示例应该已经完成​​,然后,您不必锁定或管理任何关键部分,因为您没有修改任何内容。

但是你例子,因为它是,它只是毫无意义的..

你不需要处理并发时有线程只是阅读纯数据(东西都放在可迭代的数据结构不同),但是这只有当你有静态数据不需要改变时才有用。只要你添加一个作家,那么你必须确保在没有人正在阅读的时候,如果没有作者正在做它的工作,每个人都仍然能够与其他读者同时阅读。

0

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

+0

它只是让我的代码更少,我有.ini文件,读取并设置线程启动前的数据, 我需要稍后从多个线程访问该信息,而无需修改它:)不是无用的,应用程序是非常大:)) – Tenev 2010-07-13 23:48:25

+0

@tenev,我不是想说你在做什么是无用的,但你提供给我们的例子意味着第二个线程根本不会做任何事情,因为“数据”永远是5 ... – Kiril 2010-07-14 04:29:54

1

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