条件变量

条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。

条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:
1)一个线程等待"条件变量的条件成立"而挂起;
2)另一个线程使"条件成立"(给出条件成立信号)。
为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。

1.主要涉及到下面的函数:
int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr) ---动态创建条件变量

pthread_mutex_lock ---互斥锁上锁

pthread_mutex_unlock ----互斥锁解锁

pthread_cond_wait() / pthread_cond_timedwait -----等待条件变量,挂起线程,区别是后者,会有timeout时间,如 果到了timeout,线程自动解除阻塞,这个时间和 time()系统调用相同意义的。以1970年时间算起。

pthread_cond_signal ----激活等待列表中的线程,

pthread_cond_broadcast() -------激活所有等待线程列表中最先入队的线程

注意:1)上面这几个函数都是原子操作,可以为理解为一条指令,不会被其他程序打断
           2)上面这个几个函数,必须配合使用。

3)pthread_cond_wait,先会解除当前线程的互斥锁,然后挂线线程,等待条件变量满足条件。一旦条件变                   量满足条件,则会给线程上锁,继续执行pthread_cond_wait

2. 代码实例
编译:gcc thread_test.c -o thread_test -lpthread
------必须加上-lpthread,不然会报错,找不到线程的相关函数,gcc自身没有连接线

#include<pthread.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*初始化互斥锁*/
pthread_cond_t  cond = PTHREAD_COND_INITIALIZER;//init condvoid *thread1(void*);
void *thread2(void*);int i = 1; //globalint main(void){pthread_t t_a;pthread_t t_b;//two threadpthread_create(&t_a,NULL,thread2,(void*)NULL);pthread_create(&t_b,NULL,thread1,(void*)NULL);//Create threadprintf("t_a:0x%x, t_b:0x%x:", t_a, t_b);pthread_join(t_b,NULL);//wait a_b thread endpthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond);exit(0);
}void *thread1(void *junk){for(i = 1;i<= 9; i++){pthread_mutex_lock(&mutex); //互斥锁printf("call thread1 \n");if(i%3 == 0){pthread_cond_signal(&cond); //send sianal to t_bprintf("thread1:******i=%d\n", i);}elseprintf("thread1: %d\n",i);pthread_mutex_unlock(&mutex);printf("thread1: sleep i=%d\n", i);sleep(1);printf("thread1: sleep i=%d******end\n", i);}
}void *thread2(void*junk){while(i < 9){pthread_mutex_lock(&mutex);printf("call thread2 \n");if(i%3 != 0)pthread_cond_wait(&cond,&mutex); //waitprintf("thread2: %d\n",i);pthread_mutex_unlock(&mutex);printf("thread2: sleep i=%d\n", i);sleep(1);printf("thread2: sleep i=%d******end\n", i);        }
}                                    

pthread_mutex_lock用法相关推荐

  1. 详解Java多线程编程中LockSupport类的线程阻塞用法

    转载自  详解Java多线程编程中LockSupport类的线程阻塞用法 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际 ...

  2. 【转】pthread mutex 基本用法

    转自:pthread mutex 基本用法 | feng 言 feng 语 锁是程序中经常需要用到的机制,尤其是多线程的程序中,如果没有锁的帮助,线程间的同 步就会非常麻烦甚至不可能.pthread中 ...

  3. linux C语言多线程库pthread中条件变量的正确用法逐步详解

    linux C语言多线程库pthread中条件变量的正确用法: 了解pthread常用多线程API和pthread互斥锁,但是对条件变量完全不知道或者不完全了解的人群. 关于条件变量的典型应用,可以参 ...

  4. Linux中python、C++和C语言的多线程用法整理(_thread、threading、thread和pthread)

    目录 python3 开始学习Python线程 _thread 常量和函数: 锁对象 试用基本功能 试用线程同步 threading 函数 常量 类 线程本地数据 线程对象 锁对象 递归锁对象 条件对 ...

  5. c语言中external,static关键字用法

    static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...

  6. Pandas_transform的用法

    先来看一个实例问题. 如下销售数据中展现了三笔订单,每笔订单买了多种商品,求每种商品销售额占该笔订单总金额的比例.例如第一条数据的最终结果为:235.83 / (235.83+232.32+107.9 ...

  7. Python中yield和yield from的用法

    yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...

  8. pytorch学习 中 torch.squeeze() 和torch.unsqueeze()的用法

    squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的 ...

  9. python yield 和 yield from用法总结

    #例1. 简单输出斐波那契數列前 N 个数 #缺点:该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列 #要提高 fab 函数的可复用性,最好不要直接打印出数列,而 ...

最新文章

  1. .NET中如何得到图片大小
  2. 性价比高出英特尔45%,亚马逊的云服务器芯片如何做到?| 解读
  3. ((ios开发学习笔记 十一))自定义TableViewCell 的方式实现自定义TableView(带源码)...
  4. sohu邮箱outlook设置_Outlook2016如何配置QQ邮箱详细步骤
  5. 微信公众平台开发入门教程[2019版]
  6. 收藏一个php用的一个页码按钮类
  7. sql server自动备份
  8. 傻子都能看懂的马拉车Manacher
  9. 分区变为RAW的解决办法
  10. php给网页加水印_php实现图片添加水印功能
  11. Tomcat报错:The required Server component failed to start so Tomcat is unable to start
  12. C# .net中获取台式电脑中串口设备的名称
  13. linux下画pcb的软件,Linux下画原理图和PCB
  14. C语言大作业-车辆信息管理系统
  15. Strom 消息可靠性保障机制和Ack原理
  16. win7查找自己的计算机密码忘记了怎么办,如果我忘记了win7计算机的启动密码,该怎么办...
  17. 软考-高项-论文-信息系统项目的质量管理
  18. Oracle 入门初学者安装(一)。
  19. 实验4-1-12 黑洞数
  20. 苹果的名字测试软件,抖音手机称重是什么软件叫什么名字 怎么用iPhone苹果手机称重...

热门文章

  1. python的xpath用法_python之Xpath语法
  2. php 函数静态变量,php 函数中静态变量使用的问题实例分析
  3. Effective C++ -- 零散知识点整理
  4. 第四天2017/03/31(下午1:结构体、数组)
  5. JDK Long源码
  6. Java 中 ConcurrentHashMap 原理分析
  7. 十分钟了解分布式计算:GraphLab
  8. Day 5: GruntJS——重复乏味的工作总会有人做(反正我不做)
  9. 《大话数据结构》第9章 排序 9.5 直接插入排序
  10. 【算法+OpenCV】图像极坐标变换及基于OpenCV的实现