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