C++ 11 支持跨平台线程啦,当然要尝尝鲜
之前用的各平台线程实现方式都不一样,换个平台或者换个库,使用方法就不一样了
编辑了个小例子,本来以为很容易,谁知道也要撞撞墙。
#include <stdio.h>
#include <stdlib.h>
#include <iostream> // std::cout
#include <thread> // std::thread
#include <memory>
#include <condition_variable>
#include <chrono>
using namespace std;
class Task_Base
{
public:
Task_Base();
virtual ~Task_Base();
virtual void svc();
void active();
void release();
private:
shared_ptr<thread> m_pThread;
condition_variable m_cond;
mutex m_mutex;
int m_run;
};
Task_Base::Task_Base():m_pThread(nullptr),m_run(1)
{}
Task_Base::~Task_Base()
{};
void Task_Base::active()
{
if(nullptr == m_pThread)
{
cout << "In Active1" << endl;
m_pThread = make_shared<thread>(Task_Base::svc,this);
//m_pThread->join(); //启动线程
}
};
void Task_Base::release()
{
unique_lock<mutex> ul(m_mutex);
m_cond.notify_one();
}
void Task_Base::svc()
{
int i = 0;
cout << "svc" << endl;
while(m_run)
{
{
unique_lock<mutex> ul(m_mutex);
m_cond.wait(ul);
}
cout << "Let's Go!!!!!<" << i++ << endl;
}
};
int main(int argc, const char *argv[])
{
Task_Base t1;
t1.active();
cout << "主线程为什么被阻塞啦???" << endl;
for(int i = 0; i < 10 ; i++)
{
this_thread::sleep_for(std::chrono::milliseconds(2000));
cout << "release one" << endl;
t1.release();
}
system("pause"); //主线程需要在此处阻塞,可以换用其它方法
return EXIT_SUCCESS;
} /* ---------- end of function main ---------- */
这个例子仅仅是为了学习std::thread 和 shared_ptr,查阅了网上的一些帖子,谁知道运行结果竟然和自己的设计初衷不一至。问题描述如下:
设计意图:
在主线程里创建任务线程t1,启动t1,实现主线程和子线程并行执行,
由主线程通过调用t1的relase方法释放信号量,达到线程间同步执行的效果。
出现问题:
根据众多的网贴资料,启动线程在active方法里实现,核心代码
m_pThread = make_shared<thread>(Task_Base::svc,this);
m_pThread->join(); //启动线程
实际运行时出现问题,子线程阻塞了主线程,主线程需要等待子线程运行完毕才能调用release方法,于是死锁了
问题的关键就出在了
m_pThread->join(); //启动线程
这一行上,其实在线程初始化时调用m_pThread = make_shared<thread>(Task_Base::svc,this) 时,子线程已经开始执行,
如果不需要子线程阻塞主线程,就不要调用join方法