C++初学者笔记:std::thread,子线程阻塞主线程的问题

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方法

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值