读写操作C++的线程安全性

wol*_*olf 4 c++ pthreads thread-safety

阅读有关取消和pthreads的信息,在我看来,无限循环的线程的最佳实践不是取消线程而是创建将由线程检查的标志.

这种情况意味着在某些时候,某个线程可能会在有人写入该标志时尝试读取该标志.这个线程安全吗?我如何安全地同时使用get_flag()和set_flag()?

Die*_*ühl 6

鉴于有多个人评论说"在实践中"可以阅读标志并且没有任何事情可以真正发生,我想首先指出一篇关于良性数据竞赛的好文章.仔细阅读这篇文章应该澄清,如果没有同步原语,即使在共享时也可以获得有趣的行为bool.

有点明显的方法是使用a std::atomic<bool>来安全地bool从不同的线程读取和写入.如果您不能使用std::atomic<T>,则需要找到合适的替代品,可能是互斥或特定于平台的原语.


Dav*_*rtz 1

pthreads 标准使得在一个线程中修改某个值,而在另一个线程中修改或可能修改该值是未定义的行为。实际上,如果您使用volatile bool,它将适用于您可能遇到的每个平台。如果你想严格正确,你可以使用互斥体来保护标志,使用原子操作,或者使用内存屏障。