如何用通过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;
}
#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的bind,function,boost::condition_variable实现的一个线程安全的任务队列
- C++11中std::condition_variable的使用
- C++11: std::condition_variable
- 13-7-12 android如何通过单击开始线程和停止线程
- 使用boost::condition实现线程的暂停/启动
- 使用Appium官方提供的AppiumDriverLocalService类实现在eclipse启动和停止Appium服务
- 如何通过Openssl实现私有CA,并为HTTP服务提供TLS/SLL安全机制
- 如何用C#语言通过服务来实现开机启动?
- 如何通过Java实现生成excel并通过流的方式返回,提供下载!!
- C++11 并发指南五(std::condition_variable 详解)
- 如何通过Openssl实现私有CA,并为HTTP服务提供TLS/SLL安全机制
- C++11 并发指南五(std::condition_variable 详解)
- SleepConditionVariableSRW线程最佳同步实现
- 使用JDK提供的ThreadLocal实现线程范围的共享变量(类似于Map<Thread,Variable>)
- Java多线程方面的编程笔试题(通过实现Runnable接口启动线程)
- 启动线程的五种方式方法(通过继承Thread类或实现Runnable接口)
- 如何通过Openssl实现私有CA,并为HTTP服务提供TLS/SLL安全机制
- c++11线程之条件变量condition_variable(二)
- java学习——如何实现线程之间的通信 ,Condition 的使用
- C++11 并发指南std::condition_variable详解