是否可以安全地(读取)从BITSET(C )进行一些访问,该咬合可能会通过其他线程修改
Is it safe to access (read) a bit from a bitset (C++) which may be modified by a different thread
这种类型的操作是否被认为是安全的?(换句话说,如果在另一个线程上修改了斑点,则没有机会阅读某些虚假的中间值)?具体来说,我只对阅读是否安全感兴趣,换句话说,我不是在问是否可以安全地写入两个单独线程的bitset。
eg:线程1是否可靠地获得位5的当前状态,无论是否同时设置/清除BS中的其他位?
std::bitset<64> bs;
//thread 1:
bool val;
val=bs.test(5);
// ...
//thread 2:
// set/clear a few bits
bs.set(1);
bs.set(3);
bs.set(5);
bs.reset(6);
// ...
使用 std::bitset
这样的方式是不是线程安全。
这是标准所说的有关访问bitset的说法(§20.9.2.2-51):
目的是确定数据竞赛的存在,通过结果参考的任何访问或更新分别访问或修改整个基础bitset。
因此,在另一个执行线程中读取它时,写入bitset对象是数据竞赛(触发未定义的行为)。即使所有线程都使用不同的索引访问BITSET对象。
bitset不提供原子修改,因此位的变化可能会在附近的位锁定较旧的值。
如果有一个重置(5)可能意味着线程1永远不会看到集合位。
没有stl容器是线程安全的。虽然您将无法获得中间值,但如果线程未同步,则最终可能会忽略一组值。使用atomic
操作。
相关文章:
- 类与私有变量的其他类之间的线程安全性
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- MESI协议和std::atomic-它是否确保所有写入立即对其他线程可见?
- 线程消息传递或更好:在"大师班"中访问其他班级的成员
- 锁定来自其他线程的类成员
- 使来自线程的数据流对所有其他线程都可读
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- 当只有一个线程主要使用该对象而其他线程很少使用它时,如何最小化该对象的互斥锁锁定?
- 视频在唤醒其他线程时输入设备断开连接
- 如何从其他线程 winapi 获取消息
- 将抽象对象从主线程发送到其他线程
- 使用 std::condition_variable 触发其他线程.使用哪些互斥锁?
- 在其他线程中循环访问该concurrent_vector时调用 concurrency::concurrent_vect
- 生成线程并在运行时执行其他操作,只要它处于活动状态
- C++如何判断互斥体在阻塞其他线程时是否被单个线程不成比例地占用
- tbb::enumerable_thread_specific在其他线程库中工作吗
- 当其他线程正在编写线程安全时,我是否必须互斥读操作
- 无法从其他线程播放QMediaPlayer
- 无法修改其他线程中 ref 传递的值
- 其他线程堆栈上的可用内存无效