【发布时间】:2011-06-05 06:22:08
【问题描述】:
我正在尝试一个示例,它会导致竞争条件应用互斥锁。但是,即使使用互斥体,它仍然会发生。怎么了?这是我的代码:
#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';
}
【问题讨论】:
-
只是出于好奇......你为什么不直接做
count++和moneySpent += cost;? -
tmp在该块中的目的是什么?你应该摆脱它。 -
为什么不等待循环中启动的线程完成?
-
@littleadv:我认为您发现了他的错误...也许您应该将其作为答案:-)
-
@iammillind:这就是它在低级别发生的方式。复制到寄存器,增加它,然后复制回具有变量的内存单元。我只是想演示这个过程。此外,我想要更多的代码来让竞争条件发生。这是故意的。
标签: c++ boost mutex boost-thread