Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用boost atomic消除竞争条件?_C++_Linux_Atomic_Boost Thread_Race Condition - Fatal编程技术网

C++ 如何使用boost atomic消除竞争条件?

C++ 如何使用boost atomic消除竞争条件?,c++,linux,atomic,boost-thread,race-condition,C++,Linux,Atomic,Boost Thread,Race Condition,我正在尝试使用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::atomi

我正在尝试使用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::原子g(0);
void f()
{
g、 fetch\u add(1,boost::memory\u order\u released);
返回;
}
常量int threadnum=10;
int main()
{
boost::threadpool::fifo_池tp(threadnum);
对于(int i=0;istd::cout我不太熟悉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';
}
std::原子g(0);
void f(){
g、 获取添加(1,标准::内存顺序松弛);
}
int main(){
常量int threadnum=10;
std::向量v;
对于(int i=0;istd::cout以下是一些可能有帮助的示例:

基本上,您试图用“锁”来“保护”一个“关键区域”

您可以设置或取消设置信号量

或者您可以“交换”boost“原子”变量。例如(从上面的链接):

类自旋锁{
私人:
typedef枚举{Locked,Unlocked}LockState;
原子态;
公众:
spinlock():状态_u1(未锁定){}
锁()
{
while(state_u.exchange(Locked,boost::memory_order_acquire)==Locked){
/*忙等*/
}
}
解锁()
{
状态存储(解锁,boost::内存\u顺序\u释放);
}
};

此时,您还可以假设库中存在缺陷。它不是官方/公认的boost库。您可以尝试旋转g,看看它是否达到10。我们不知道您的硬件,但
内存\u顺序\u松弛
并不是最可移植的选项。它肯定会在某些类型的CPU上产生不一致的结果。
class spinlock {
private:
  typedef enum {Locked, Unlocked} LockState;
  boost::atomic<LockState> state_;

public:
  spinlock() : state_(Unlocked) {}

  lock()
  {
    while (state_.exchange(Locked, boost::memory_order_acquire) == Locked) {
      /* busy-wait */
    }
  }
  unlock()
  {
    state_.store(Unlocked, boost::memory_order_release);
  }
};