多线程连续打印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;
}

 

你可能感兴趣的:(c++)