所以在主要内容中我有一个std::atomic<int>
。它被发送到生成随机数的线程:
void wind_thread(std::atomic<int>* wind)
{
while(total_planes < max_plane )
{
*wind = random(1, 360);
}
}
其他2个线程得到这个变量并用它来做事,这是一个例子:
void land_thread(std::atomic<int>* wind, std::queue<Plane> *land, Runway *north_south, Runway *east_west)
{
while(total_planes <= max_plane)
{
if(land->size() == 0){}
else
{
std::lock_guard<std::mutex> guard(my_mutex);
std::cout << "Plane " << land->front().get_plane_id()
<< " landed on " << wind_string(wind) << " Wind was: "
<< *wind << std::endl;
land->front().set_details(wind_string(wind));
if((*wind >= 46 && *wind <= 135) || (*wind >= 226 && *wind <= 315))
{
east_west->land(land->front());
land->pop();
}
else
{
north_south->land(land->front());
land->pop();
}
total_planes++;
}
}
}
land_thread中的风很好但是当我将它传递给wind_string()
函数时,它会获得一个新的值。
如果我对wind线程进行锁定,它的工作正常,但我认为使用std::atomic<int>* x
的重点是,如果只有一个线程写入它,我就不需要使用锁。是因为我将它传递给线程之外的函数吗?我一直在网上寻找,我能找到的就是我不需要锁。如果有人能解释为什么它的行为像这样,或者有一个更多关于原子行为的链接,那将是值得赞赏的。感谢。
答案 0 :(得分:2)
由于wind
的原子设置没有锁定,因此您无法保证在某个时间看到wind
值。所有原子给你的是,在设置时,这个值会被传播,所以任何人在>> 之前读取它将获得设定值。它还保证在设置此原子int之前设置之前设置的任何内容也将是可见的。
但是,在您的示例中,当您在另一个线程中持有锁时,不会阻止wind
被修改。
答案 1 :(得分:0)
你的风线将使用100%使用的整个线程,以保持你的风随机。在那里添加一些sleep
以避免对CPU造成不必要的压力或减慢程序速度
或者考虑只是按需生成随机值。 (见Why does an empty loop use so much processor time?)
atomic只会使对数据本身的访问成为原子
if((*wind >= 46 && *wind <= 135) || (*wind >= 226 && *wind <= 315))
仍然可以在每次检查时更改wind
。你可以事先复制当前的风。类似的东西:
int currentWind = wind->load();
if((currentWind >= 46 && currentWind <= 135) || (currentWind >= 226 && currentWind <= 315))
或者像之前一样使用互斥锁