我的情况是一个线程读取并想要 决定是否需要改变价值?
下面的一些事情
void set(bool status)
{
if(status == m_status)
return;
monitor.lock();
m_status = status;
}
如果可能的话?
答案 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库深处的跨平台实现,但遗憾的是它没有暴露给用户。