1字节共享内存是否需要互斥锁?

Is Mutex required for 1 byte shared memory

本文关键字:字节 共享 内存 是否      更新时间:2023-10-16

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

就像

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

如果这是可能的?

为布尔状态使用同步对象是多余的。

在Windows上你可以使用Interlocked Variable Access

对于跨平台解决方案…参见Boost Atomic

C++11中的

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

我认为你需要稍微澄清一下你的问题。这可能吗?是的。有必要吗?可能。还有其他方法吗?是的,正如另一个答案所指出的。

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

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

当然这只是我个人的看法。

一般来说是不可能的。它在大多数平台上的大多数时间都可以工作,但它在形式上是未定义的,并且在某些情况下,缓存一致性问题会困扰你。

如果你能得到c++ 11,使用std::atomic<bool>从新的<atomic>头。如果没有,则应该使用特定于遗留编译器的等效程序。Windows有Interlocked *函数,GCC有__sync关键字。实际上,c++ 11标准中重要部分的跨平台实现深埋在Boost中。进程间库,但不幸的是它没有公开给用户。