所以在 main 中我有一个 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()
时接受 std::atomic<int>* x
的函数, 它获得了一个新的值(value)。
如果我在 wind 线程上加锁,它会工作正常,但我认为使用 std::atomic
的全部意义是如果只有一个线程正在写入它,我就不需要使用锁。是因为我将它传递给线程外的函数吗?我一直在网上四处寻找,我所能找到的就是我不需要锁。如果有人可以解释为什么它的行为是这样的,或者有一个链接可以更深入地了解原子的行为方式,我们将不胜感激。谢谢。
最佳答案
由于 wind
的原子设置没有锁定,您绝对不能保证您将看到 wind
在特定时间拥有的值。所有 atomic 给你的是,从设置时起,这个值将被传播,这样任何在之前它被重置的人都将获得设置值。它还保证在设置此原子 int 之前设置的任何内容也将是可见的。
但是,在您的示例中,当您在另一个线程中持有锁时,没有什么可以阻止 wind
被修改。
关于c++ - 使用 std::atomic 时锁定线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34598881/