多线程连续打印01010101

【多线程连续打印01010101】有两个线程,一个打印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 ul(mu); c_v.wait(ul, [id](){return id == current; }; //lambda表达式返回1时,线程被唤醒。否则阻塞到当前位置。 cout<

使用两个函数:
void fun0(){ while(true){ /* *加锁 *设置唤醒当前线程的条件,(当前线程开始被阻塞了) *打印 *解锁 *更新打印条件,这个条件在当前线程再次打印时能阻塞当前线程 *唤醒其他线程 */ unique_lock ul(mu); c_v.wait(ul, [](){return current == 0; }); //lambda表达式返回1时,线程被唤醒。否则阻塞到当前位置。 current = 1; cout<<"0"; ul.unlock(); c_v.notify_all(); } } void fun1(){ while(true){ /* *加锁 *设置唤醒当前线程的条件,(当前线程开始被阻塞了) *打印 *解锁 *更新打印条件,这个条件在当前线程再次打印时能阻塞当前线程 *唤醒其他线程 */ unique_lock ul(mu); c_v.wait(ul, [](){return current == 1; }); //lambda表达式返回1时,线程被唤醒。否则阻塞到当前位置。 current = 0; cout<<"1"; ul.unlock(); c_v.notify_all(); }}int main(){ thread t1(fun0); thread t2(fun1); t1.join(); t2.join(); system("pause"); return 0; }


    推荐阅读