使用条件变量唤起和暂停一个线程。注意点在注释中
#include <iostream>
#include <mutex>
#include <queue>
#include <condition_variable>
#include <thread>
#include <unistd.h>//sleep
std::mutex mut;
std::condition_variable_any data_cond;
bool is = false; //只在一个线程中更改值
void start()
{
std::lock_guard <std::mutex> lck(mut);
is = true;
data_cond.notify_one();
}
void stop()
{
std::lock_guard <std::mutex> lck(mut);
is = false;
std::cout << "sss" << std::endl;
}
void data_process_thread(){
while(true){
std::unique_lock<std::mutex> locker(mut);
while(!is)
{
std::cout << "进来了" << std::endl;
data_cond.wait(mut); //condition_variable_any这里等待的是mutex,condition_variable等待的是lock,如果写反,你将无法暂停线程。
}
std::cout << "aaaa" << std::endl;
locker.unlock();
sleep(1);//这里的睡眠原因是要主线程得到锁去暂停子线程。如果主线程暂停在子线程执行之后,也就是while(!is)之后,将无法暂停子线程
}
}
int main(){
std::thread t1(data_process_thread);
t1.detach();
std::cout << "开始" << std::endl;
sleep(2);
start();
sleep(5);
std::cout << "停止" << std::endl;
stop();
while(1)g++ -g main.cpp -std=c++11 -pthread
{
}
return 0;
}
g++ -g main.cpp -std=c++11 -pthread
本文由 Ryan 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2019/06/17 14:02