一个简单的互斥量与条件变量例子
#include <pthread.h> #include <stdio.h> #include <stdlib.h> //互斥变量和条件变量静态初始化 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*初始化互斥锁*/ pthread_cond_t cond = PTHREAD_COND_INITIALIZER;/*初始化条件变量*/void *thread1(void *); void *thread2(void *); int i=1;int main(void) {// sleep(30); pthread_t t_a;pthread_t t_b;pthread_create(&t_a,NULL,thread1,(void *)NULL);/*创建进程t_a*/pthread_create(&t_b,NULL,thread2,(void *)NULL); /*创建进程t_b*/pthread_join(t_a, NULL);/*等待进程t_a结束*/pthread_join(t_b, NULL);/*等待进程t_b结束*/pthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond);exit(0); }/* pthread_t pthread_self(void); 函数作用:获得线程自身的ID。 pthread_t的类型为unsigned long int, 所以在打印的时候要使用%lu方式,否则将产生奇怪的结果 */ void *thread1(void *junk) {for(i=1;i<=6;i++){pthread_mutex_lock(&mutex);/*锁住互斥量*/{printf("Thread1: lock ------%lu\n", pthread_self());}if(i%3==0){printf("Thread1:signal1------%lu\n", pthread_self());pthread_cond_signal(&cond);/*条件改变,发送信号,通知t_b进程*/printf("Thread1:signal2------%lu\n", pthread_self());sleep(1);}pthread_mutex_unlock(&mutex);/*解锁互斥量*/printf("Thread1: unlock ------%lu\n", pthread_self());sleep(1);} }void *thread2(void *junk) {while(i<6){pthread_mutex_lock(&mutex);printf("Thread2: lock ------%lu\n", pthread_self());if(i%3!=0){printf("Thread2: wait1------%lu\n", pthread_self());pthread_cond_wait(&cond,&mutex);/*解锁mutex,并等待cond改变*/printf("Thread2: wait2------%lu\n", pthread_self());}pthread_mutex_unlock(&mutex);printf("Thread2: unlock ------%lu\n", pthread_self());sleep(1);} }/* [ztteng@ztteng 7.7_8]$ ./pthreadcond Thread2: lock ------3068291952 Thread2: wait1------3068291952 Thread1: lock ------3078781808 Thread1: unlock ------3078781808 Thread1: lock ------3078781808 Thread1: unlock ------3078781808 Thread1: lock ------3078781808 Thread1:signal1------3078781808 Thread1:signal2------3078781808 Thread1: unlock ------3078781808 Thread2: wait2------3068291952 Thread2: unlock ------3068291952 Thread1: lock ------3078781808 Thread1: unlock ------3078781808 Thread2: lock ------3068291952 Thread2: wait1------3068291952 Thread1: lock ------3078781808 Thread1: unlock ------3078781808 Thread1: lock ------3078781808 Thread1:signal1------3078781808 Thread1:signal2------3078781808 Thread1: unlock ------3078781808 Thread2: wait2------3068291952 Thread2: unlock ------3068291952 */
这里有几个问题;(1)一个是为什么是thread2先执行(2)假若thread1先执行;并发送了signal信号,这时thread2还没有起来会怎么样
转载于:https://www.cnblogs.com/ztteng/articles/3178973.html
一个简单的互斥量与条件变量例子相关推荐
- C++11学习笔记-----互斥量以及条件变量的使用
在多线程环境中,当多个线程同时访问共享资源时,由于操作系统CPU调度的缘故,经常会出现一个线程执行到一半突然切换到另一个线程的情况.以多个线程同时对一个共享变量做加法运算为例,自增的汇编指令大致如下, ...
- 互斥量、条件变量与pthread_cond_wait()函数的使用,详解(二)
互斥量.条件变量与pthread_cond_wait()函数的使用,详解(二) 1.Linux"线程" 进程与线程之间是有区别的,不过linux内核只提供了轻量进程的支持,未实现线 ...
- c++ 互斥量和条件变量
线程同步时会遇到互斥量和条件变量配合使用的情况,下面看一下C++版的. test.h #include <pthread.h> #include <iostream>class ...
- Linux下互斥量与条件变量详细解析
1. 首先pthread_cond_wait 的定义是这样的 The pthread_cond_wait() and pthread_cond_timedwait() functions are us ...
- 并发编程(一): POSIX 使用互斥量和条件变量实现生产者/消费者问题
boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t和pthread_cond_t的一系列的封装.因此通过对 ...
- 信号灯文件锁linux线程,linux——线程同步(互斥量、条件变量、信号灯、文件锁)...
一.说明 linux的线程同步涉及: 1.互斥量 2.条件变量 3.信号灯 4.文件读写锁 信号灯很多时候被称为信号量,但个人仍觉得叫做信号灯比较好,因为可以与"SYSTEM V IPC的信 ...
- Linux下多线程编程互斥锁和条件变量的简单使用
Linux下的多线程遵循POSIX线程接口,称为pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,链接时需要使用库libpthread.a.线程是进程的一个实体,是CPU ...
- Multi_thread--Linux下多线程编程互斥锁和条件变量的简单使用
Linux下的多线程遵循POSIX线程接口,称为pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,链接时需要使用库libpthread.a.线程是进程的一个实体,是CPU ...
- 【C++】多线程互斥锁、条件变量
我们了解互斥量和条件变量之前,我们先来看一下为什么要有互斥量和条件变量这两个东西,了解为什么有这两东西之后,理解起来后面的东西就简单很多了!!! 先来看下面这段简单的代码: int g_num = 0 ...
最新文章
- 20181113-2 每周例行报告
- AXIS2整合spring需要的jar,以及大部分缺少jar所报的异常
- python编程入门指南上下百度云-Python编程入门指南(上下册)
- java log4j 多个文件_为什么log4j会记录到两个单独的文件? [重复]
- Judge Route Circle
- Java实现读取pdf文件内容(how to read pdf in java)
- Console.WriteLine在以Windows Application方式下编译会产生性能问题
- c++代码表白_推荐!在浪漫的日子里程序猿如何用C语言实现520表白代码
- 51nod-猴猴吃香蕉【dp】
- 函数无法识别_PostgreSQL找不到最佳函数问题解析
- php调用谷歌翻译接口_一个google翻译的php调用方式
- 键值数据库LevelDB的优缺点及性能分析
- html5自动填充父类框,html5和css3进阶(浮动)----02
- 萌新分享打印文件夹下所有文件的代码
- 解决CMake Error : file does not recognize sub-command GL0B or GL0B_RECURSE 原因分析
- [GIS教程] 7 空间数据查询与空间度量
- 基于BCNN的汽车车型识别研究
- 按下鼠标滚轮c语言,C++检测鼠标某键是否按下
- PS4手柄控制无人驾驶小车车
- 收藏了!3D建模软件大全,想入门3D建模的小伙伴一定不要错过