#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

一个简单的互斥量与条件变量例子相关推荐

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

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

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

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

  3. c++ 互斥量和条件变量

    线程同步时会遇到互斥量和条件变量配合使用的情况,下面看一下C++版的. test.h #include <pthread.h> #include <iostream>class ...

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 20181113-2 每周例行报告
  2. AXIS2整合spring需要的jar,以及大部分缺少jar所报的异常
  3. python编程入门指南上下百度云-Python编程入门指南(上下册)
  4. java log4j 多个文件_为什么log4j会记录到两个单独的文件? [重复]
  5. Judge Route Circle
  6. Java实现读取pdf文件内容(how to read pdf in java)
  7. Console.WriteLine在以Windows Application方式下编译会产生性能问题
  8. c++代码表白_推荐!在浪漫的日子里程序猿如何用C语言实现520表白代码
  9. 51nod-猴猴吃香蕉【dp】
  10. 函数无法识别_PostgreSQL找不到最佳函数问题解析
  11. php调用谷歌翻译接口_一个google翻译的php调用方式
  12. 键值数据库LevelDB的优缺点及性能分析
  13. html5自动填充父类框,html5和css3进阶(浮动)----02
  14. 萌新分享打印文件夹下所有文件的代码
  15. 解决CMake Error : file does not recognize sub-command GL0B or GL0B_RECURSE 原因分析
  16. [GIS教程] 7 空间数据查询与空间度量
  17. 基于BCNN的汽车车型识别研究
  18. 按下鼠标滚轮c语言,C++检测鼠标某键是否按下
  19. PS4手柄控制无人驾驶小车车
  20. 收藏了!3D建模软件大全,想入门3D建模的小伙伴一定不要错过

热门文章

  1. 微软正式发布PowerShell Core 6.0
  2. Bzoj1007 [HNOI2008]水平可见直线
  3. Word无法读取此文档,文档可能已损坏
  4. 《微积分》框架逻辑的简单理解
  5. Blender相关的一些链接(持续更新)
  6. python的namedtuple
  7. 车联网中如何应用大数据
  8. Html代码打包后如何修改,html代码打包封装成APP教程
  9. python工作目录_python获取当前工作目录
  10. 美赛整理之Matlab读取全球海洋温度数据并显示干货