一、两个线程交替打印
#include<thread>
#include<iostream>
#include<mutex>
#include<condition_variable>
using namespace std;
mutex data_mutex;
condition_variable data_var;
bool flag = true;
void printA(){
while(1){
unique_lock<mutex> lck(data_mutex);
data_var.wait(lck,[]{return flag;});
cout<<"ThreadA:"<<this_thread::get_id()<<"printf"<<"--A"<<endl;
flag = false;
data_var.notify_one();
}
}
void printB(){
while(1){
unique_lock<mutex> lck(data_mutex);
data_var.wait(lck,[]{return !flag;});
cout<<"ThreadB:"<<this_thread::get_id()<<"printf"<<"--B"<<endl;
flag = true;
data_var.notify_one();
}
}
int main(){
thread tA(printA);
thread tB(printB);
tA.join();
tB.join();
return 0;
}
二、条件变量实现生产者消费者
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
int counter=0;
int maxSize = 30;
std::mutex mtx;
std::queue<int> dataQuene;
std::condition_variable producer, consumer;
void func_consumer()
{
while (true)
{
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
std::unique_lock<std::mutex> lck(mtx);
consumer.wait(lck, [] {return dataQuene.size() != 0; });
int num=dataQuene.front();
dataQuene.pop();
std::cout << "consumer " << std::this_thread::get_id() << ": "<< num <<std::endl;
producer.notify_all();
}
}
void func_producer()
{
while (true)
{
std::this_thread::sleep_for(std::chrono::milliseconds(900));
std::unique_lock<std::mutex> lck(mtx);
producer.wait(lck, [] {return dataQuene.size() != maxSize; });
++counter;
dataQuene.push(counter);
std::cout << "producer " << std::this_thread::get_id() << ": "<< counter <<std::endl;
consumer.notify_all();
}
}
int main()
{
std::thread consumers[2], producers[2];
for (int i = 0; i < 2; ++i)
{
consumers[i] = std::thread(func_consumer);
producers[i] = std::thread(func_producer);
}
for (int i = 0; i < 2; ++i)
{
producers[i].join();
consumers[i].join();
}
system("pause");
return 0;
}