c++ - 使用 std::atomic 时锁定线程

标签 c++ multithreading c++11

所以在 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/

相关文章:

c++ - 如何确保仅在 C++ 中提供时才使用特定的类功能?

c++11 - c++11内存模型的宽松排序

c++ - 在作为函数参数传递的指针上使用 delete

c++ - 关于调用继承函数

c# - 在 C# 中允许多个读者的锁

C# 同步进行异步调用

C++:对 child 隐藏方法

c++ - Netbeans 8.1(用于 C/C++)找不到我的编译器(gcc-6.0.0 开发版)

java - java多线程环境下如何关闭线程

C++ move 语义 - 包装遗留 C API