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

condition

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

condition

转载
https://www.cnblogs.com/-citywall123/p/12774088.html
https://www.cnblogs.com/xiaohaigegede/p/14008121.html

一、总述
在C++11中,我们可以使用条件变量(condition_variable)实现多个线程间的同步操作;当条件不满足时,相关线程被一直阻塞,直到某种条件出现,这些线程才会被唤醒。

主要成员函数如下

1、wait函数:
(1)wait(unique_lock &lck)

当前线程的执行会被阻塞,直到收到 notify 为止。

(2)wait(unique_lock &lck,Predicate pred)

当前线程仅在pred=false时阻塞;如果pred=true时,不阻塞。

wait()可依次拆分为三个操作:释放互斥锁、等待在条件变量上、再次获取互斥锁

2、notify_one:
notify_one():没有参数、没有返回值。

解除阻塞当前正在等待此条件的线程之一。如果没有线程在等待,则还函数不执行任何操作。如果超过一个,不会指定具体哪一线程。



实例

//编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕
#include
#include 
#include 
#include
#include 
int num = 0;
std::mutex _mutex;
std::condition_variable cv;

void thread_func(int id)
{
    for (int i = 0; i < 10; i++)
    {
        //注意锁的类型
        std::unique_lock  lg(_mutex);

        //线程id!=num的会被阻塞
        while (id != num)
            cv.wait(lg);

        printf("%c", id + 'A');
        num = (num + 1) % 3;
        //当线程号为id的线程执行完之后,唤醒其它线程重新竞争锁
        cv.notify_all();
    }
}

int main()
{
    int i;
    std::thread p[3];
    //创建三个线程,分别负责打印ABC
    for (i = 0; i < 3; i++)
        p[i] = std::thread(thread_func, i);
    for (i = 0; i < 3; i++)
        p[i].join();
    system("pause");
    return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/311571.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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