您的位置:首页 > 编程语言 > C语言/C++

如何用通过C++11提供的std::condition_variable实现主线程控制子线程的启动和停止

2017-07-09 12:23 501 查看
#include <Windows.h>

#include <iostream>              

#include <thread>               

#include <mutex>                

#include <condition_variable>   

#include <sstream>

using namespace std;

bool g_bReady = false; // 是否准备好

std::mutex g_mutexReady; // g_bReady的锁

std::condition_variable g_cvReady; // g_bReady的条件变量.

bool g_bFinish = false; //是否完成任务

std::mutex g_mutexFinish;  //g_bFinish的锁

std::condition_variable g_cvFinish; // g_bFinish的条件变量

bool g_bThreadRun = false; //是否退出线程

std::mutex g_mtxThreadRun; //g_bThreadRun的锁

void do_print_id(int id)

{
while (1)
{
//等待执行任务的命令
{
std::unique_lock <std::mutex> lck(g_mutexReady);
while (!g_bReady)
{
g_cvReady.wait(lck);
}

{
std::unique_lock <std::mutex> lck(g_mtxThreadRun);
if (!g_bThreadRun)
{
cout << "Exit thread" << endl;
break;
}
}

//模拟任务执行
std::cout << "task " << id << " begin"<<endl;
std::cout << "task " << id << " finish" << endl;

g_bReady = false;//将ready置为false,准备等待下一次的任务
}

//通知主线程完成任务
{
cout << "Notify main thread" << endl;
std::unique_lock <std::mutex> lck(g_mutexFinish);
g_bFinish = true;
g_cvFinish.notify_all();  
}

}//while (1)

}

int main()

{
//初始化变量
g_bReady = false;
g_bFinish = false;
{
std::unique_lock <std::mutex> lck(g_mtxThreadRun);
g_bThreadRun = true;
}

std::thread thread;
thread = std::thread(do_print_id, 1);

while (1)
{
//如果用户输入了空格键则跳出,输入了x则结束程序
while (1)
{
std::cout << "Press space to start task and press \'x\' to exit:";
string data;
getline(cin, data);
if (data == " ")
{
break;
}
else if (data == "x")
{
std::unique_lock <std::mutex> lck(g_mtxThreadRun);
g_bThreadRun = false;
cout << "Begin Exit" << endl;
break;
}
else
{
::Sleep(10);
}
}

//通知子线程执行任务
cout << "Start the task" << endl;
{
std::unique_lock <std::mutex> lck(g_mutexReady);
g_bReady = true; // 设置全局标志位为 true.
g_cvReady.notify_all(); // 唤醒所有线程.
}

//是否退出while循环
{
std::unique_lock <std::mutex> lck(g_mtxThreadRun);
if (!g_bThreadRun)
{
break;
}
}

//等待任务执行完毕
{
std::unique_lock <std::mutex> lck(g_mutexFinish);
while (!g_bFinish)
{
g_cvFinish.wait(lck);
}
g_bFinish = false; //重置bFinish状态
}

}//while(1)

thread.join();

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 11 多线程