C++ 11 实现两个线程交替打印0-100的数字

        使用两个线程来交替打印0-100 的数字,因为num需要做num++运算,num是临界资源,因此需要一个mutex互斥量来达到对num变量的互斥访问。

        使用 std::condition_variable 信号量来达到两个线程同步,交替的打印0-100的数字。

        其中 std::condition_variable 信号量 的wait( condition_variable &) 函数会将程序阻塞在此处,然后释放传入的 互斥量,让其他线程能够访问到临界资源,然后等待其他线程中对该 condition_variavle 变量使用 notify 操作之后 ,会对传入的互斥量再次进行上锁,然后 恢复运行。

        1、对于 condition_variable 使用 wait 操作通常是在 当前线程中,对于临街资源的访问结束之后,来唤醒其他线程的来访问临界资源,以达到多个线程 的同步运行。

        2、notify的使用,可以是在 使用wait阻塞当前线程之前 使用notity 来唤醒另一个线程,达到两个线程的交替运行 。  也可以在一个函数中进行notify,其他函数中 来进行 wait,类似于一对多的生产者消费者模型

        用于记录自己的学习过程,如果不正确的地方,还请斧正

int num = 1;
std::mutex mtx;
std::condition_variable cond;

void fun() {
    while(num<=100) {
        std::unique_lock<std::mutex> lock(mtx);//互斥锁,管理临界资源num
        std::cout << num++ << std::endl;
        //进去wait的时候释放lock锁 , 出来lock的时候 加锁lock
        cond.notify_one();//自己完成 之后唤醒其他的wait线程
        cond.wait(lock);//释放锁lock,允许其他线程访问临街资源lock,自己阻塞,等待其他线程notify
        lock.unlock();
    }
    std::cout << "end" << std::endl;
    //先运行的线程到这里之后,由于另一个线程迟迟收不到notify,因此还被阻塞在最后一次for循环中
    cond.notify_one();
}

int main() {

    std::thread a(fun);
    std::thread b(fun);
    if (a.joinable()) a.join();
    if (b.joinable()) b.join();
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值