线程同步时会遇到互斥量和条件变量配合使用的情况,下面看一下C++版的。

test.h

#include <pthread.h>
#include <iostream>class T_Mutex
{
public:T_Mutex() { pthread_mutex_init(&mutex_, NULL); }~T_Mutex() { pthread_mutex_destroy(&mutex_); }void Lock() { pthread_mutex_lock(&mutex_); }void Unlock() { pthread_mutex_unlock(&mutex_); }pthread_mutex_t *getMutex() { return &mutex_; }private:pthread_mutex_t mutex_;
};class T_Condition {
public:T_Condition(pthread_mutex_t *mutex) : _mutex(mutex) {pthread_cond_init(&_cond, NULL);}~T_Condition() {pthread_cond_destroy(&_cond);}int Wait() {   pthread_cond_wait(&_cond, _mutex); }void Signal() { pthread_cond_signal(&_cond); }void Broadcast() { pthread_cond_broadcast(&_cond); }private:pthread_cond_t _cond;pthread_mutex_t *_mutex;
};class T_MutexCond : public T_Mutex, public T_Condition {
public:explicit T_MutexCond(void) : T_Mutex(), T_Condition(getMutex()) {}
};class ScopedLock {
public:explicit ScopedLock(pthread_mutex_t *mutex) : m_mutex(mutex) {  //传入mutexpthread_mutex_lock(m_mutex);}explicit ScopedLock(T_Mutex *mutex) : m_mutex(mutex->getMutex()) { //传入T_Mutexpthread_mutex_lock(m_mutex);}~ScopedLock() {pthread_mutex_unlock(m_mutex); }private:ScopedLock();pthread_mutex_t *m_mutex;
};

将互斥量和条件变量对应的API封装起来,ScopedLock的构造自动加锁,析构自动释放锁很便捷。

test.cpp

#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include "test.h"T_MutexCond m_cond;
unsigned count = 0;void *func1(void *arg)
{ScopedLock lock(&m_cond);while(count == 0){printf("func1 Wait\n");m_cond.Wait();}count = count + 1;printf("func1_count =%d\n",count);
}void *func2(void *arg)
{ScopedLock lock(&m_cond);if(count == 0){printf("func2 Signal\n");m_cond.Signal();}count = count + 1;printf("func2_count =%d\n",count);
}int main(void)
{pthread_t tid1, tid2;pthread_create(&tid1, NULL, func1, NULL);sleep(5);pthread_create(&tid2, NULL, func2, NULL);pthread_join(tid1, NULL);pthread_join(tid2, NULL);return 0;
}

运行结果为:func1 Wait
                      func2 Signal
                      func2_count =1
                      func1_count =2

pthread_cond_wait(&_cond, _mutex)内部有释放互斥锁的操作,不然func2不可能获取到互斥锁。ScopedLock避免了C语言的手动释放锁的操作。

c++ 互斥量和条件变量相关推荐

  1. C++11学习笔记-----互斥量以及条件变量的使用

    在多线程环境中,当多个线程同时访问共享资源时,由于操作系统CPU调度的缘故,经常会出现一个线程执行到一半突然切换到另一个线程的情况.以多个线程同时对一个共享变量做加法运算为例,自增的汇编指令大致如下, ...

  2. 互斥量、条件变量与pthread_cond_wait()函数的使用,详解(二)

    互斥量.条件变量与pthread_cond_wait()函数的使用,详解(二) 1.Linux"线程" 进程与线程之间是有区别的,不过linux内核只提供了轻量进程的支持,未实现线 ...

  3. Linux下互斥量与条件变量详细解析

    1. 首先pthread_cond_wait 的定义是这样的 The pthread_cond_wait() and pthread_cond_timedwait() functions are us ...

  4. 信号灯文件锁linux线程,linux——线程同步(互斥量、条件变量、信号灯、文件锁)...

    一.说明 linux的线程同步涉及: 1.互斥量 2.条件变量 3.信号灯 4.文件读写锁 信号灯很多时候被称为信号量,但个人仍觉得叫做信号灯比较好,因为可以与"SYSTEM V IPC的信 ...

  5. 并发编程(一): POSIX 使用互斥量和条件变量实现生产者/消费者问题

    boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t和pthread_cond_t的一系列的封装.因此通过对 ...

  6. 一个简单的互斥量与条件变量例子

    #include <pthread.h> #include <stdio.h> #include <stdlib.h> //互斥变量和条件变量静态初始化 pthre ...

  7. 【C++】多线程互斥锁、条件变量

    我们了解互斥量和条件变量之前,我们先来看一下为什么要有互斥量和条件变量这两个东西,了解为什么有这两东西之后,理解起来后面的东西就简单很多了!!! 先来看下面这段简单的代码: int g_num = 0 ...

  8. Linux下多线程编程互斥锁和条件变量的简单使用

    Linux下的多线程遵循POSIX线程接口,称为pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,链接时需要使用库libpthread.a.线程是进程的一个实体,是CPU ...

  9. c++ linux 线程等待与唤醒_C++ Linux线程同步机制:POSIX信号量,互斥锁,条件变量...

    线程同步机制:POSIX 信号量,互斥量,条件变量 POSIX 信号量 常用的POSIX 信号量函数为如下5个: sem_init sem_destroy sem_wait sem_trywait s ...

最新文章

  1. 基于C++的OpenCV常用函数
  2. [第11天]mySQL简单介绍
  3. ef6+mysql的bug
  4. 数据挖掘系列(2)--关联规则FpGrowth算法
  5. vim 中的 quickfix 指令
  6. 基于主动学习算法减少人工标注量,提升文本标注效率的方案探究
  7. 铁汁儿们,现在面试阿里巴巴必考K8S
  8. JS 数字,金额用逗号隔开
  9. yolov3-tiny 训练一个检测器(1)
  10. Win10 Edge浏览器假死解决方案
  11. apache mod_rewrite 简略说明
  12. 二叉树的深度和平衡二叉树的深度
  13. Object Detection经典代码与文章
  14. myeclipse 10.0下载及安装
  15. RabbitTMQ实战 高效部署分布式消息队列笔记
  16. FFMpeg 否决问题
  17. 【论文阅读】Don‘t be so sure! Boosting ASR Decoding via Confidence Relaxation
  18. freertos与linux区别,μClinux、μC/OS-II、eCos、FreeRTOS和djyos操作系统的特点及不足-嵌入式系统-与非网...
  19. 微信打开html没声音,电脑微信收款怎么没声音
  20. Vivado HLS加速卷积层运算

热门文章

  1. 【Android 性能优化】布局渲染优化 ( GPU 过度绘制优化总结 | CPU 渲染过程 | Layout Inspector 工具 | View Tree 分析 | 布局组件层级分析 )
  2. 【Android RTMP】RTMP 直播推流服务器搭建 ( Ubuntu 18.04.4 虚拟机 )
  3. 【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片
  4. python3.6+RF环境搭建
  5. Mysql 8.0安装
  6. MySQL与SQLServer的区别(一千条语句)
  7. 巧妙使用网页在线工具,让您的工作更简单
  8. python-管理MySQL之ConfigParser模块
  9. ESPCMS基本导航操作
  10. 清理Visual Studio2010产生的垃圾调试文件