C++11条件变量condition_variable配合mutex操作,利用mutex在保持互斥,利用条件变量的wait与notify函数来保持线程的等待与互斥。
上代码:
#include <iostream>
#include<thread>
#include<condition_variable>
#include<queue>
#include<vector>
using namespace std;
class A
{
public:
bool isfull()const{ return m_queue.size()==m_max;}
bool isempty() const{return m_queue.empty();}
A(int maxsize):m_max(maxsize){}
void Put(int x)
{
lock_guard<mutex>locker(m_mutex);
cout<<m_queue.size()<<endl;
while(isfull())
{
cout<<"is fulee"<<endl;
m_notfull.wait(m_mutex);
}
m_queue.push(x);
m_notempty.notify_one();
}
void take(int& x)
{
lock_guard<mutex>locker(m_mutex);
while(isempty())
{
cout<<" is empty"<<endl;
m_notempty.wait(m_mutex);
}
cout<<m_queue.size()<<endl;
x=m_queue.front();
m_queue.pop();
m_notfull.notify_one();
}
private:
queue<int>m_queue;
mutex m_mutex;
condition_variable_any m_notfull;
condition_variable_any m_notempty;
int m_max;
};
void fun(int i,A &a)
{
a.Put(i);
}
void fun1(int i,A &a)
{
a.take(i);
}
int main()
{
A a(8);
vector<thread>t1;
for(int i=0;i<10;i++)
{
thread t(fun,i,ref(a));
t1.push_back(move(t));
}
for(int i=0;i<10;i++)
{
thread t(fun1,i,ref(a));
t1.push_back(move(t));
}
for(auto &i:t1)
{
i.join();
}
return 0;
}