#include<iostream>
#include<deque>
#include<thread>
#include<mutex>
#include<pthread.h>
std::deque<int> q;//先进先出
std::mutex mu;
void function_1()//生产着
{
int count=10;
while(count>0)
{
std::unique_lock<std::mutex> locker(mu);
q.push_front(count);
locker.unlock();
std::this_thread::sleep_for(std::chrono::seconds(1));//延时1s
count--;
}
}
void function_2()//消费者
{
int data=0;
while(data!=1)
{
std::unique_lock<std::mutex> locker(mu);
if(!q.empty())
{
data=q.back();
q.pop_back();
locker.unlock();
std::cout<<"t2 got a value from t1:"<<data<<std::endl;
}
else
{
locker.unlock();
}
}
}
int main()
{
std::thread t1(function_1);
std::thread t2(function_2);
t1.join();
t2.join();
return 0;
}
程序运行步骤是这样的:
1.首先同时运行t1线程和t2线程
2.先进入t1线程的function_1()函数,这个时候加了mymutex锁,另外一个t2线程进入后发现mymutex锁没有释放,只能等待。
3.当过去10个循环(每个循环1秒后)t1线程结束,unique_lock lock(mymutex)的生命周期结束,mymutex锁释放,执行t2线程,此时开始一直读取。
关于此文件的CMakeLists.txt文件编写
cmake_minimum_required(VERSION 2.8)
project(test_mutex)
add_compile_options(-std=c++11 -g -Wall)
add_executable(test_mutex test_mutex.cpp)
target_link_libraries(test_mutex pthread)
必须要链接到pthread线程库,否则编译出错。