首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

boost多线程一个奇怪的有关问题,有点搞不明白

2013-08-01 
boost多线程一个奇怪的问题,有点搞不明白代码是这样的:#include iostream#include boost/thread.hppus

boost多线程一个奇怪的问题,有点搞不明白
代码是这样的:


#include <iostream>
#include <boost/thread.hpp>
using namespace std;
#include "windows.h"


class TestA
{
public:
TestA(int x)
{
cout << "new TestA()" << endl;
x_ = x;
}

int GetX()
{
return x_;
}

void SetX(int x)
{
x_ = x;
}

private:
int x_;
};


class TestVC
{
public:

TestVC()
{
running_flag = true;       
}

void stop()
{
running_flag = false;
{
boost::recursive_mutex::scoped_lock lock(mtx);
cond.notify_all();
}
}

void waitSignalThread(TestA& texta)
{
boost::recursive_mutex::scoped_lock lock(mtx);   
while(running_flag)
{
//cout << "start wait signal" << endl;           
cond.wait(mtx);
cout << "texta x value is : " << texta.GetX() << endl;
//cout << "finish wait signal" << endl;           
}
}

void emitSignalThread(TestA& texta)
{
int i = 100;
while (running_flag)
{
{
boost::recursive_mutex::scoped_lock lock(mtx);
cout << "start emit singal" << endl;
texta.SetX(i--);
//cout << "texta x value is : " << texta.GetX() << endl;
cond.notify_one();
Sleep(100);
cout << "finish emit signal" << endl;
}
}
}

private:

bool running_flag;
boost::recursive_mutex mtx;
boost::condition_variable_any cond;

};


int main()
{
boost::thread_group grp;
TestVC test;
TestA testa(0);

grp.create_thread(boost::bind(&TestVC::waitSignalThread, &test, boost::ref(testa)));
grp.create_thread(boost::bind(&TestVC::emitSignalThread, &test, boost::ref(testa)));

//test.stop();
grp.join_all();

return 0;
}


奇怪的是emitSignalThread中的texta.SetX(i--);执行了N多次,waitSignalThread才会执行一次?
但我换成cout << "start wait signal" << endl;、cout << "finish wait signal" << endl;这样的语句,就只执行一次了?



这是什么问题?很奇怪啊 这!不合逻辑啊! 多线程 Boost 线程
[解决办法]

引用:
按道理来说emitSignalThread函数中的cond.notify_one();给了waitSignalThread一个通知,waitSignalThread就能执行了。并且emitSignalThread发了通知之后,也Sleep了,不存在还是用cpu时间片的问题吧!这是为啥呢!

Sleep的位置放得不正确,应该放在这个方法调用结束之后

void emitSignalThread(TestA& texta)
{
int i = 100;
while (running_flag)
{
{
boost::recursive_mutex::scoped_lock lock(mtx);
cout << "start emit singal" << endl;
texta.SetX(i--);
//    cout << "texta x value is : " << texta.GetX() << endl;
cond.notify_one();
//Sleep(100);
cout << "finish emit signal" << endl;
}
Sleep(100);
}
}

热点排行