其他分享
首页 > 其他分享> > c-如何使用升压原子消除竞争条件?

c-如何使用升压原子消除竞争条件?

作者:互联网

我正在尝试使用boost :: atomic在Linux上进行多线程同步.

但是,结果不一致.

任何帮助将不胜感激.

谢谢

#include <boost/bind.hpp>
#include <boost/threadpool.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread.hpp>
#include <boost/atomic.hpp>

boost::atomic<int> g(0) ;

void f()
{

    g.fetch_add(1, boost::memory_order_relaxed);

    return ;
 }
 const int threadnum = 10;
 int main()
 {
    boost::threadpool::fifo_pool tp(threadnum);
    for (int i = 0 ; i < threadnum ; ++i)
            tp.schedule(boost::bind(f));
    tp.wait();
    std::cout << g << std::endl ;
    return 0 ;
  }

解决方法:

我不特别熟悉boost线程库或boost :: threadpool,但在我看来,访问g的值不一定完全完成了线程,因此您将获得0到10之间的某个值.

这是您的程序,已修改为使用标准库,并插入了联接,以便提取添加发生在g的输出之前.

std::atomic<int> g(0);

void f() {
    g.fetch_add(1, std::memory_order_relaxed);
}

int main() {
    const int threadnum = 10;
    std::vector<std::thread> v;

    for (int i = 0 ; i < threadnum ; ++i)
        v.push_back(std::thread(f));

    for (auto &th : v)
        th.join();

    std::cout << g << '\n';
}

编辑:

如果您的程序与添加的tp.wait()仍然不一致,则令人困惑.添加应该发生在线程结束之前,并且我认为线程结束将与tp.wait()同步,后者发生在读取之前.因此,即使您使用memory_order_relaxed,所有添加操作都应在g出现之前进行,因此打印值应为10.

标签:boost-thread,atomic,race-condition,linux,c-4
来源: https://codeday.me/bug/20191201/2079194.html