std::condition_variable与std::unique_lock的结合使用

std::mutex mutex;
std::condition_variable cv;

// 条件变量与临界区有关,用来获取和释放一个锁,因此通常会和mutex联用。
std::unique_lock lock(mutex);
// 此处会释放lock,然后在cv上等待,直到其它线程通过cv.notify_xxx来唤醒当前线程,cv被唤醒后会再次对lock进行上锁,然后wait函数才会返回。
// wait返回后可以安全的使用mutex保护的临界区内的数据。此时mutex仍为上锁状态
cv.wait(lock)

上文摘自: C++11多线程-条件变量(std::condition_variable) - 简书前面我们介绍了线程(std::thread)和互斥量(std::mutex),互斥量是多线程间同时访问某一共享变量时,保证变量可被安全访问的手段。在多线程编程中,还有另一种十...https://www.jianshu.com/p/a31d4fb5594f

 之前总是纳闷,为什么明明对mutex进行unique锁定了,其他线程还能再次获取到该锁,进行后续的操作。上文对其进行很好的说明。

实际上wait函数已经进行了解释,只是没有消化了,通过上面链接,更好地进行了理解。

写了测试程序进行了验证

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

#include <thread>
#include <mutex>
#include <condition_variable>

static std::mutex mtx;
static std::condition_variable cv;

void runthread(int index)
{
    std::unique_lock<std::mutex> lck(mtx);
    fprintf(stderr, "thread:%d is waiting.\n", index);
    cv.wait(lck);
    fprintf(stderr, "thread:%d is wakeup.\n", index);
}

int main()
{
    fprintf(stderr, "pid:%d\n", getpid());
    std::thread* pt[5];
    for (int i = 0; i < 5; i++)
    {
        pt[i] = new std::thread(runthread, i);
    }

    for (int i = 0; i < 30; i++)
    {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        fprintf(stderr, "main thread sleep %d seconds\n", i);
    }

    cv.notify_all();

    for (int i = 0; i < 5; i++)
    {
        if (pt[i]->joinable())
        {
            pt[i]->join();
            delete pt[i];
            pt[i] = NULL;
        }
    }

    return 0;
}

执行的一次结果如下:

pid:8571
thread:0 is waiting.
thread:1 is waiting.
thread:4 is waiting.
thread:3 is waiting.
thread:2 is waiting.
main thread sleep 0 seconds
main thread sleep 1 seconds
main thread sleep 2 seconds
main thread sleep 3 seconds
main thread sleep 4 seconds
main thread sleep 5 seconds
main thread sleep 6 seconds
main thread sleep 7 seconds
main thread sleep 8 seconds
main thread sleep 9 seconds
main thread sleep 10 seconds
main thread sleep 11 seconds
main thread sleep 12 seconds
main thread sleep 13 seconds
main thread sleep 14 seconds
main thread sleep 15 seconds
main thread sleep 16 seconds
main thread sleep 17 seconds
main thread sleep 18 seconds
main thread sleep 19 seconds
main thread sleep 20 seconds
main thread sleep 21 seconds
main thread sleep 22 seconds
main thread sleep 23 seconds
main thread sleep 24 seconds
main thread sleep 25 seconds
main thread sleep 26 seconds
main thread sleep 27 seconds
main thread sleep 28 seconds
main thread sleep 29 seconds
thread:0 is wakeup.
thread:1 is wakeup.
thread:4 is wakeup.
thread:3 is wakeup.
thread:2 is wakeup.

写该测试程序的另外一个目的:确认使用mutex及condition_variable是否会增加进程的task数量(结果:不会增加)

[xxxx@localhost ~]$ ls /proc/8571/task/
8571  8572  8573  8574  8575  8576

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值