C++11并行编程-条件变量(condition_variable

<condition_variable >头文件主要包含有类和函数相关的条件变量。

包括相关类 std::condition_variable和 std::condition_variable_any,还有枚举类型std::cv_status。另外还包含函数 std::notify_all_at_thread_exit(),以下分别介绍一下以上几种类型。

std::condition_variable 类介绍

std::condition_variable是条件变量,很多其它有关条件变量的定义參考维基百科。Linux下使用 Pthread库中的 pthread_cond_*() 函数提供了与条件变量相关的功能, Windows 则參考 MSDN

当 std::condition_variable对象的某个wait 函数被调用的时候,它使用 std::unique_lock(通过 std::mutex) 来锁住当前线程。

当前线程会一直被堵塞。直到另外一个线程在同样的 std::condition_variable 对象上调用了 notification 函数来唤醒当前线程。

std::condition_variable 对象通常使用 std::unique_lock<std::mutex> 来等待,假设须要使用另外的 lockable 类型,能够使用std::condition_variable_any类。本文后面会讲到 std::condition_variable_any 的使用方法。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

#include <iostream>                // std::cout

#include <thread>                // std::thread

#include <mutex>                // std::mutex, std::unique_lock

#include <condition_variable>    // std::condition_variable

std::mutex mtx; // 全局相互排斥锁.

std::condition_variable cv; // 全局条件变量.

bool ready = false// 全局标志位.

void do_print_id(int id)

{

    std::unique_lock <std::mutex> lck(mtx);

    while (!ready) // 假设标志位不为 true, 则等待...

        cv.wait(lck); // 当前线程被堵塞, 当全局标志位变为 true 之后,

    // 线程被唤醒, 继续往下运行打印线程编号id.

    std::cout << "thread " << id << '\n';

}

void go()

{

    std::unique_lock <std::mutex> lck(mtx);

    ready = true// 设置全局标志位为 true.

    cv.notify_all(); // 唤醒全部线程.

}

int main()

{

    std::thread threads[10];

    // spawn 10 threads:

    for (int i = 0; i < 10; ++i)

        threads[i] = std::thread(do_print_id, i);

    std::cout << "10 threads ready to race...\n";

    go(); // go!

  for (auto & th:threads)

        th.join();

    return 0;

}

结果:

1

2

3

4

5

6

7

8

9

10

11

10 threads ready to race...

thread 1

thread 0

thread 2

thread 3

thread 4

thread 5

thread 6

thread 7

thread 8

thread 9

std::condition_variable 的拷贝构造函数被禁用,仅仅提供了默认构造函数。

看看 std::condition_variable 的各个成员函数

std::condition_variable::wait() 介绍:

std::condition_variable提供了两种 wait() 函数。

1

2

3

4

void wait (unique_lock<mutex>& lck);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值