有两个线程,一个打印0,一个打印1,让两个线程连续打印010101。一般情况下,多个线程要同时请求cpu资源,所以对打印语句加锁是不行的,因为解锁后谁也不知道哪个线程又抢到了cpu资源。
分析:如果线程0打印”0“,下一步必然让线程0阻塞,并且唤醒线程1。然后线程1打印"1",之后让线程1阻塞,唤醒线程2。这样依次执行。
使用方法:condition_variable类的使用。
使用一个函数:
mutex mu;
condition_variable c_v;
int current = 0;
void fun(int id){
while(true){
/*
*加锁
*设置唤醒当前线程的条件,(当前线程开始被阻塞了)
*打印
*解锁
*更新打印条件,这个条件在当前线程再次打印时能阻塞当前线程
*唤醒其他线程
*/
unique_lock<mutex> ul(mu);
c_v.wait(ul, [id](){return id == current;};//lambda表达式返回1时,线程被唤醒。否则阻塞到当前位置。
cout<<id<<" ";
current = (current + 1)%2;
ul.unlock();
c_v.notify_all();
}
int main(){
thread t1(fun, 0);
thread t2(fun, 1);
t1.join();
t2.join