多线程连续打印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<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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值