C++:条件变量condition_variable_any

/ C++ / 没有评论 / 2031浏览

使用条件变量唤起和暂停一个线程。注意点在注释中

#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