使用std :: atomic时锁定线程

时间:2016-01-04 20:00:23

标签: c++ multithreading c++11

所以在主要内容中我有一个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的重点是,如果只有一个线程写入它,我就不需要使用锁。是因为我将它传递给线程之外的函数吗?我一直在网上寻找,我能找到的就是我不需要锁。如果有人能解释为什么它的行为像这样,或者有一个更多关于原子行为的链接,那将是值得赞赏的。感谢。

2 个答案:

答案 0 :(得分:2)

由于wind的原子设置没有锁定,因此您无法保证在某个时间看到wind值。所有原子给你的是,在设置时,这个值会被传播,所以任何人在> 之前读取它将获得设定值。它还保证在设置此原子int之前设置之前设置的任何内容也将是可见的。

但是,在您的示例中,当您在另一个线程中持有锁时,不会阻止wind被修改。

答案 1 :(得分:0)

1

你的风线将使用100%使用的整个线程,以保持你的风随机。在那里添加一些sleep以避免对CPU造成不必要的压力或减慢程序速度 或者考虑只是按需生成随机值。 (见Why does an empty loop use so much processor time?

2

atomic只会使对数据本身的访问成为原子

            if((*wind >= 46 && *wind <= 135) || (*wind >= 226 && *wind <= 315))

仍然可以在每次检查时更改wind。你可以事先复制当前的风。类似的东西:

int currentWind = wind->load();
if((currentWind >= 46 && currentWind <= 135) || (currentWind >= 226 && currentWind <= 315))  

或者像之前一样使用互斥锁