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

u011191275 2013-07-30 08:54:39
代码是这样的:

#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;这样的语句,就只执行一次了?

这是什么问题?很奇怪啊 这!不合逻辑啊!
...全文
152 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你的while里面有一个局部域{},把Sleep放在最后面才正确
  • 打赏
  • 举报
回复
引用 1 楼 u011191275 的回复:
按道理来说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);
	}
}
u011191275 2013-07-30
  • 打赏
  • 举报
回复
按道理来说emitSignalThread函数中的cond.notify_one();给了waitSignalThread一个通知,waitSignalThread就能执行了。并且emitSignalThread发了通知之后,也Sleep了,不存在还是用cpu时间片的问题吧!这是为啥呢!

65,189

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧