仍然有boost :: mutex的竞争条件

Amu*_*umu 2 c++ boost mutex boost-thread

我正在尝试一个例子,它会导致竞争条件应用互斥锁.但是,即使使用互斥锁,它仍然会发生.怎么了?这是我的代码:

#include <iostream>
#include <boost/thread.hpp>
#include <vector>
using namespace std;
class Soldier
{
private:
  boost::thread m_Thread;
public:
  static int count , moneySpent;
  static boost::mutex soldierMutex;   
  Soldier(){}
  void start(int cost)
  {
    m_Thread = boost::thread(&Soldier::process, this,cost);
  }

  void process(int cost)
  {
    {
    boost::mutex::scoped_lock lock(soldierMutex);
    //soldierMutex.lock();
    int tmp = count;
    ++tmp;
    count = tmp;
    tmp = moneySpent;
    tmp += cost;
    moneySpent = tmp;  
   // soldierMutex.unlock();
    }
  }  

  void join()
  {
    m_Thread.join();
  }
};

int Soldier::count, Soldier::moneySpent;
boost::mutex Soldier::soldierMutex;

int main()
{
  Soldier s1,s2,s3;
  s1.start(20);
  s2.start(30);
  s3.start(40);
  s1.join();
  s2.join();
  s3.join();
  for (int i = 0; i < 100; ++i)
    {
      Soldier s;
      s.start(30);
    }
  cout << "Total soldier: " << Soldier::count << '\n';
  cout << "Money spent: " << Soldier::moneySpent << '\n';
}
Run Code Online (Sandbox Code Playgroud)

lit*_*adv 7

看起来你不是在等待循环中开始的线程完成.将循环更改为:

 for (int i = 0; i < 100; ++i)
 {
   Soldier s;
   s.start(30);
   s.join();
 }
Run Code Online (Sandbox Code Playgroud)

编辑进一步解释

你看到的问题是打印出的值是错误的,所以你假设线程中存在竞争条件.事实上,比赛是在你打印价值的时候 - 它们被印刷了,而并非所有线程都有机会执行

  • 请注意,这序列化了线程.要并行运行它们,可以在堆上分配`Soldier`s并且有第二个循环来加入它们,但是没关系,因为锁无论如何都会序列化它们 (2认同)