1字节共享内存是否需要互斥锁?
Is Mutex required for 1 byte shared memory
我的情况是一个线程读取并想要决定是否需要更改值?
就像
下面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中。进程间库,但不幸的是它没有公开给用户。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 从不同线程使用int64的不同字节安全吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 在UNIX系统中使用DIR查找文件的字节大小
- 在cuda线程之间共享大量常量数据
- 如何从具有移动语义的类对象中生成共享指针
- 在c代码之间共享数据的最佳方式
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- std::当在256字节边界上写入整数时,流的奇怪行为
- 将静态库链接到不带-fPIC的共享库中
- 当比特(而不是字节)的顺序至关重要时的持久性
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 有没有办法通过共享内存中的指针到达某个字节
- CUDA错误:共享数据太多(0x4018字节,最大0x4000):额外的0x18字节从哪里来
- 1字节共享内存是否需要互斥锁?
- Cuda有效地从字节数组复制到不同大小的共享内存元素
- 将16字节和256字节复制到共享内存之间的差异
- 从BCRYPT_SECRET_HANDLE导出共享密钥为字节数组