1字节共享内存需要Mutex吗?

时间:2011-11-07 13:45:46

标签: c++ multithreading

我的情况是一个线程读取并想要 决定是否需要改变价值?

下面的一些事情

void set(bool status)
{ 
    if(status == m_status)
         return;
     monitor.lock();
     m_status = status;

}

如果可能的话?

3 个答案:

答案 0 :(得分:3)

将同步对象用于布尔状态是过度的。

在Windows上,您可以使用Interlocked Variable Access

对于跨平台解决方案..请参阅Boost Atomic

来自C ++ 11的

std::atomic也是一个解决方案

答案 1 :(得分:2)

我想你需要澄清一下你的问题。可能吗?是。有必要吗?大概。还有其他方法吗?是的,正如另一个答案所指出的那样。

当你完成了想要改变的事情时,别忘了解锁。只是一个风格的笔记,我发现使用你的'if'语句来封装代码块而不是返回函数更清楚。像这样:

void set(bool status)
{ 
    if(status != m_status)
    {
        monitor.lock();
        m_status = status;
        monitor.unlock();
    }
}

当然是我的意见。

答案 2 :(得分:1)

一般来说,这是不可能的。它大部分时间都可以在大多数平台上运行,但它是正式未定义的,并且有些情况会出现缓存一致性问题。

如果您可以获得C ++ 11,请使用新std::atomic<bool>标头中的<atomic>。如果没有,您应该使用遗留的编译器特定的等价物。 Windows具有Interlocked *个函数,GCC具有__sync个关键字。实际上,C ++ 11标准的重要部分实际上存在于Boost.Interprocess库深处的跨平台实现,但遗憾的是它没有暴露给用户。