1.条件变量

(1)当一个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了。例如:一个线程访问队列时,发现队列为空,它只能等待,直到其它线程将节点添加到队列中。这种情况就需要用到条件变量。

(2)用于线程间同步共享数据的值。条件变量提供了一种线程间的通知机制:当某个共享数据达到某个值的时候,唤醒等待这个共享数据的线程。

(3)无界缓冲区

(4) 多个消费者可以同时等待这个变量,生产者可以操作这个变量

2.条件变量使用规范

1.等待条件代码

pthread_mutex_lock(&mutex);while (条件为假)
{pthread_cond_wait(&cond, &mutex);
}
修改条件pthread_mutex_unlock(&mutex);

2.给条件发送信号代码

pthread_mutex_lock(&mutex);设置条件为真
pthread_cond_signal(&cond);pthread_mutex_unlock(&mutex);

3.条件变量函数

1.pthread_cond_init

(1)功能:初始化条件变量

2.pthread_cond_destory

(1)该函数可以用来摧毁所指定的条件变量,同时将会释放所给它分配的资源。调用该函数的进程并不要求等待在参数所指定的条件变量上;

3.pthread_cond_wait

pthread_cond_wait原语完成三件事:

(1)对mutex解锁;

(2)等待条件, 直到有线程向他发送通知;

(3)当wait返回时, 再对mutex重新加锁;

4.pthread_cond_signal

(1)pthread_cond_signal原语所完成的操作:

向第一个等待条件的线程发起通知, 如果没有任何一个线程处于等待条件的状态, 那么这个通知将被忽略;

(2)pthread_cond_broadcast:

向所有等待在该条件上的线程发送通知;

4.使用条件变量解决生产者消费者问题

#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <pthread.h>
#include <semaphore.h>#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>#define ERR_EXIT(m) \do \{ \perror(m); \exit(EXIT_FAILURE); \}while(0)#define CONSUMERS_COUNT 2
#define PRODUCERS_COUNT 5pthread_mutex_t g_mutex;
pthread_cond_t g_cond;pthread_t g_thread[CONSUMERS_COUNT + PRODUCERS_COUNT];//无界缓冲区
int nready = 0;//表示当前缓冲区产品个数
void* consume(void* arg) {int i;int num = *(int*)arg;free(arg);while(1) {pthread_mutex_lock(&g_mutex);while(nready == 0) {printf("%d begin wait a condition ...\n", num);pthread_cond_wait(&g_cond, &g_mutex);}printf("%d end wait a condition ...\n", num);printf("%d begin consume product ...\n", num);--nready; // 消费产品printf("%d end consume product ...\n", num);pthread_mutex_unlock(&g_mutex);sleep(5);}return NULL;
}void* produce(void* arg) {int i;int num = *(int*)arg;free(arg);while(1) {pthread_mutex_lock(&g_mutex);printf("%d begin produce product ...\n", num);++nready;printf("%d end produce product ...\n", num);pthread_cond_signal(&g_cond);printf("%d signal ...\n", num);pthread_mutex_unlock(&g_mutex);sleep(5);}return NULL;
}
int main(int argc, char* argv[]) {int i;pthread_mutex_init(&g_mutex, NULL); pthread_cond_init(&g_cond, NULL);for(i=0; i<CONSUMERS_COUNT; i++) {int* p = (int*)malloc(sizeof(int));*p = i;pthread_create(&g_thread[i], NULL, consume, (void*)p); }sleep(1);for(i=0; i<PRODUCERS_COUNT; i++) {int* p = (int*)malloc(sizeof(int));*p = i;pthread_create(&g_thread[CONSUMERS_COUNT+i], NULL, produce, (void*)p); }for(i=0; i<CONSUMERS_COUNT+PRODUCERS_COUNT; i++) {pthread_join(g_thread[i], NULL);}
//  pthread_mutex_destory(&g_mutex);
//  pthread_cond_destory(&g_cond);return 0;
}

POSIX 条件变量相关推荐

  1. Linux多线程实践(8) --Posix条件变量解决生产者消费者问题

    Posix条件变量 int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); int pthread_co ...

  2. Linux多线程实践(六)使用Posix条件变量解决生产者消费者问题

    前面的一片文章我们已经讲过使用信号量解决生产者消费者问题.那么什么情况下我们须要引入条件变量呢? 这里借用  http://www.cnblogs.com/ngnetboy/p/3521547.htm ...

  3. linux网络编程之posix 线程(四):posix 条件变量与互斥锁 示例生产者--消费者问题

    http://blog.csdn.net/jnu_simba/article/details/9129939 一.posix 条件变量 一种线程间同步的情形:线程A需要等某个条件成立才能继续往下执行, ...

  4. POSIX条件变量API函数

    初始化条件变量 int pthread_cond_init(pthread_cond_t *cond,const pthread_condattr_t *attr); 返回值:函数成功返回0:任何其他 ...

  5. 【转载】同步和互斥的POSIX支持(互斥锁,条件变量,自旋锁)

    上篇文章也蛮好,线程同步之条件变量与互斥锁的结合: http://www.cnblogs.com/charlesblc/p/6143397.html  现在有这篇文章: http://blog.csd ...

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

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

  7. Linux Qt使用POSIX多线程条件变量、互斥锁(量)

    今天团建,但是文章也要写.酒要喝好,文要写美,方为我辈程序员的全才之路.嘎嘎 之前一直在看POSIX的多线程编程,上个周末结合自己的理解,写了一个基于Qt的用条件变量同步线程的例子.故此来和大家一起分 ...

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

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

  9. Linux——线程同步(条件变量、POSIX信号量)和线程池

    一.线程同步 (一).概念 线程同步是一种多线程关系,指的是线程之间按照特定顺序访问临界资源,进而能够避免线程饥饿问题. 所谓线程饥饿指的是某个线程长期"霸占"临界资源,导致其他线 ...

最新文章

  1. 量化指标公式源码_通达信实用指标:《看涨跌》指标公式源码
  2. 英语发音表及读法_在英语中年月日的读法和写法(附:英美时间表达差异辨析)...
  3. python利用函数求20的阶乘_请运用reduce函数,计算20的阶乘,慕课网2-19
  4. html 列导航包括导航,在HTML5中,主导航应该在元素内部还是外部?
  5. Pandas学习导图
  6. 关于Linux不能ping通外网的解决方法
  7. 【April Fools Day Contest 2014F】【愚人节脑洞 OEIS大法】000001 输出序列某一项
  8. 量子计算机物理原理,量子信息物理原理
  9. pandas填充空数组_Pandas 数据处理:空值清理、联级、合并、缺省空值填充
  10. Tex中关于字体更换的问题
  11. vivo手机光环助手下载游戏怎么打不开_“点亮夜色,点亮你”——全新5G自拍手机,vivo S6系列正式发布...
  12. 使用中国气象局的天气预报webservice
  13. JetBrains的注册
  14. html 和css常见的面试题
  15. 分享150个ASP源码,总有一款适合您
  16. 【软件工程】第10组 团队展示
  17. C/C++编程新手入门基础系列:俄罗斯方块小游戏制作源代码
  18. 理财启蒙必读书籍《小钱狗狗》心得
  19. 基于EF框架的数据库操作方法
  20. 结构体的应用与理解.戴维营第九天

热门文章

  1. C#设计模式之二十一访问者模式(Visitor Pattern)【行为型】
  2. date命令使用文档.txt
  3. 40行代码的人脸识别实践【转】
  4. Cisco Nexus-1000v授权
  5. 联想亮出智能手机全面投身移动互联网
  6. 李天平: 技术以外的功夫
  7. 应用管理系列 — 怎么管理Sybase数据库
  8. Linux 命令(131)—— usermod 命令
  9. C++11 Lambda表达式
  10. codevs 1422 河城荷取