看看这个代码:多线程 - 我需要锁定读取数据吗?
int data=5;
void Thread1()
{
if(data==5)
{
//nothing
}
}
void Thread2()
{
if(data==2)
{
//nothing
}
}
在这种情况下
,做我需要使用EnterCriticalSection的/ MutexLock之前如果(数据= =)?
看看这个代码:多线程 - 我需要锁定读取数据吗?
int data=5;
void Thread1()
{
if(data==5)
{
//nothing
}
}
void Thread2()
{
if(data==2)
{
//nothing
}
}
在这种情况下
,做我需要使用EnterCriticalSection的/ MutexLock之前如果(数据= =)?
如果您只是读取数据,则不需要锁。
如果您正在编写数据AND您关心订单数据的阅读,那么您需要使用CS来确保订单是正确的。 (请注意,如果对象有一个更复杂的状态,在原子操作中未更新,那么您可能会更关心读取/写入的顺序)。
如果不关心订单,您仍然想要将变量更改为volatile,否? – Inverse 2010-07-14 07:00:20
volatile的使用是依赖于多线程方面的编译器体系结构。阅读相应的文档。 – 2010-07-14 14:23:55
如果什么都不改变数据,那么在大多数架构上,没有。但如果没有任何数据发生变化,代码就没有意义了。
这就是我的想法。 – GManNickG 2010-07-13 23:21:20
在产生任何额外的线程之前初始化一些全局变量是非常有用的,并且从这一点开始数据是共享读取但不再被写入。 – 2010-07-13 23:41:02
如果您的示例应该已经完成,然后否,您不必锁定或管理任何关键部分,因为您没有修改任何内容。
但是你例子,因为它是,它只是毫无意义的..
你不需要处理并发时有线程只是阅读纯数据(东西都放在可迭代的数据结构不同),但是这只有当你有静态数据不需要改变时才有用。只要你添加一个作家,那么你必须确保在没有人正在阅读的时候,如果没有作者正在做它的工作,每个人都仍然能够与其他读者同时阅读。
如果数据正在被另一个线程改变,那么在读取数据时需要一个内存栏以确保一致性。锁是实现记忆围栏的一种方式,但不一定是最佳方式。但是,除非您发现(通过测量!)锁定会显着减慢程序,否则可能不值得担心替代方案。
就你而言,不,你不需要MutexLock。 – Siddiqui 2010-07-14 05:47:32