#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h> #define MAX_COUNT 9
pthread_mutex_t mutex; //互斥变量
pthread_cond_t cond; //条件变量
int count = 0; void AddCount_Odd_Func(void);
void AddCount_Even_Func(void); int main()
{
int ret;
pthread_t odd_thread, even_thread; //两个线程
pthread_attr_t thread_attr; //线程的属性结构 count = 0;
pthread_mutex_init(&mutex, NULL); //互斥变量的初始化
pthread_cond_init(&cond, NULL); //条件变量的初始化
ret = pthread_attr_init(&thread_attr); //属性结构体初始化
if (ret != 0)
{
perror("Attribute Creation Failed!");
exit(EXIT_FAILURE);
} pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED); //设置线程分离状态的函数,PTHREAD_CREATE_DETACHED(分离线程):不需要创建线程的线程等待
//函数运行结束线程便终止,同时释放占用的系统资源
ret = pthread_create(&odd_thread, &thread_attr, (void *)&AddCount_Odd_Func, NULL);
if (ret != 0)
{
perror("Thread Creation Failed!");
exit(EXIT_FAILURE);
}
ret = pthread_create(&even_thread, &thread_attr, (void *)&AddCount_Even_Func, NULL);
if (ret != 0)
{
perror("Thread Creation Failed!");
exit(EXIT_FAILURE);
} while (count < MAX_COUNT);
printf("Finished!\n");
pthread_cond_destroy(&cond); //销毁条件变量
pthread_mutex_destroy(&mutex);
return 0;
} void AddCount_Odd_Func(void)
{
pthread_mutex_lock(&mutex);
while (count < MAX_COUNT)
{
if (count % 2 == 1)
{
count++;
printf("AddCount_Odd_Func(): count = %d.\n", count);
pthread_cond_signal(&cond); //用来释放被阻塞在条件变量cond上的线程
}
else
pthread_cond_wait(&cond, &mutex); //使线程阻塞在条件变量cond上
}
pthread_mutex_unlock(&mutex);
} void AddCount_Even_Func(void)
{
pthread_mutex_lock(&mutex);
while (count < MAX_COUNT)
{
if (count % 2 == 0)
{
count++;
printf("AddCount_Even_Func(): count = %d.\n", count);
pthread_cond_signal(&cond);
}
else
pthread_cond_wait(&cond, &mutex);
}
pthread_mutex_unlock(&mutex);
}

gcc example.c -lpthread

运行结果如下:

最新文章

  1. ubuntu 下简单录音
  2. android中ADT和SDK的关系
  3. Codeforces Round #337 (Div. 2) B. Vika and Squares 水题
  4. Java 流的概述及操作(转)
  5. Preference如何增加在activity生命周期监听器
  6. KMP 代码 暂存
  7. 关于Java中String类的hashCode方法
  8. Python之Django rest_Framework
  9. WebAPI问题追踪日志记录过滤器
  10. 二。Hibernate 查询 HQL、SQL方式
  11. Spring常用注解总结
  12. Thrift 入门教程
  13. PCA,到底在做什么
  14. Android 进程间的通信
  15. 2-SAT问题的小结
  16. gitee 使用
  17. 使用jQuery+huandlebars遍历数组
  18. RecyclerView 下拉刷新和加载更多
  19. Intermediate Python for Data Science learning 1 - Basic plots with matplotlib
  20. 一个java高级工程师的进阶

热门文章

  1. Java集合类之向量Vector
  2. 各种HTTP错误消息含义
  3. 【Linux远程管理】SSH协议远程管理
  4. Android TextView中的ellipsize属性
  5. html5 鼠标跟随运动
  6. wcf教程
  7. find 日常使用
  8. hadoop2.2原理: 序列化浅析
  9. 转自 z55250825 的几篇关于FFT的博文(一)
  10. epub显示特殊字体