栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 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;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1038559.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号