Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 1字节共享内存是否需要互斥_C++_Multithreading - Fatal编程技术网

C++ 1字节共享内存是否需要互斥

C++ 1字节共享内存是否需要互斥,c++,multithreading,C++,Multithreading,我的案例是一个线程读取,并希望 决定是否需要更改该值 像下面这样的东西 void set(bool status) { if(status == m_status) return; monitor.lock(); m_status = status; } 如果可能的话?对布尔状态使用同步对象是过分的 在Windows上,您可以使用 用于跨平台解决方案。。看 来自C++11的std::atomic也是一个解决方案我认为您需要澄清一下您的问题。可能

我的案例是一个线程读取,并希望 决定是否需要更改该值

像下面这样的东西

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

}

如果可能的话?

对布尔状态使用同步对象是过分的

在Windows上,您可以使用

用于跨平台解决方案。。看


来自C++11的
std::atomic
也是一个解决方案

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

当你完成想要改变的事情时,不要忘记解锁。从风格上讲,我发现使用“if”语句来封装代码块比从函数中返回“ing”要清晰得多。像这样:

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

当然,这只是我的意见。

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


如果您可以获得C++11,请从新的
标题中使用
std::atomic
。如果不是,则应使用传统编译器特定的等效项。Windows有
互锁
*功能,GCC有
\u sync
关键字。实际上,Boost.Interprocess库中有一个C++11标准重要部分的跨平台实现,但不幸的是,它没有向用户公开。

是的,就像您所做的那样。怎么了?我想确定一下。我知道,当两个线程想要写入甚至1字节时,这是有问题的。然后我问一个线程是否需要不带互斥的读取我很确定所有这些指令都是在字大小(至少32位)的变量上工作的,而不是单字节的。如果OP想使用C++11中的std::atomic。。你的意思是
char
(或者更好:
uint8\u t
,不是bool,但你是对的。
std::atomic
可以对所有类型的基本整数类型进行操作。gcc似乎也提供bool类型。.“互斥”和“std::atomic”以及“联锁变量访问”之间有什么不同呢OP的
监视器
是一个RAII互斥锁,因此不需要显式解锁它。