c++之多线程访问全局变量: should I use mutex
sxdcgaq8080
阅读:112
2025-05-04 20:05:19
评论:0
假设我有2个线程:std::thread thd1; std::thread thd2;线程thd1定期设置一些全局变量,该全局变量调用以下setFlag函数:
static std::int32_t g_flag;
static std::mutex io_mutex;
void setFlag( std::int32_t flag )
{
//std::lock_guard<std::mutex> lk(io_mutex);
g_flag = flag;
}
并且线程thd2定期读取此标志
std::int32_t getFlag()
{
//std::lock_guard<std::mutex> lk(io_mutex);
return g_flag;
}
问题是-在这种情况下我应该使用互斥锁吗?在没有互斥量的情况下从多个线程以读写方式访问变量是否安全?
请您参考如下方法:
在不同步的情况下访问一个线程中的存储位置以及在另一个线程中进行读取或写入另一个线程中的存储位置,并且至少其中之一是非原子的,这被称为数据竞争,并在C++中导致未定义的行为。
在您的代码中,对线程1的g_flag的写访问与线程2对同一变量的读访问不同步。
因此,您的程序具有未定义的行为(因为所有访问都不是原子的)。
一种可能的解决方案是在注释的代码中正确演示时使用互斥锁,该互斥锁将同步读取和写入访问,从而使一个发生在另一个之前,尽管这些发生在前面的顺序仍然不确定。
另一种可能性是将g_flag声明为atomic:
std::atomic<std::int32_t> g_flag{};
如上所述,原子访问(由
std::atomic提供)明确免于在可能并行访问以进行写入和读取时导致数据争用和未定义的行为。
原子将(通常)不会像互斥锁/锁那样使另一个线程等待。但是,这也确实使您在访问其他共享内存时也很难正确使用。
相反,
std::atomic还有其他选项来指定是否以及如何排序原子访问周围的其他内存访问,即是否以及在什么程度上也将导致线程之间的同步。
没有更多详细信息,我无法确定您要使用的合适工具。
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。



