unix 互斥锁与信号量应用例子
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,#include#include #include #include #include #include #define SIZE 3#define STR_SIZE 20pthread_mutex_
千家信息网最后更新 2025年12月03日unix 互斥锁与信号量应用例子
- #include<pthread.h>
- #include<semaphore.h>
- #include<stdlib.h>
- #include<stdio.h>
- #include<string.h>
- #include<unistd.h>
- #define SIZE 3
- #define STR_SIZE 20
- pthread_mutex_t mutex; //全局变量对main 及 线程函数都可见
- sem_t read_sem, write_sem; //全局变量对main 及 线程函数都可见
- struct _buf_
- {
- char* buf[SIZE];
- int front, rear;
- }buffer; //循环队列结构体
- void thread(void)
- {
- while(1)
- {
- if(0 != sem_wait(&read_sem))
- {
- perror("sem_wait_0");
- exit(1);
- }
- if(0 != pthread_mutex_lock(&mutex))
- {
- perror("pthread_mutex_lock_0");
- exit(1);
- }
- fputs("output characters:\n",stdout);
- fputs(buffer.buf[buffer.front],stdout);
- buffer.front = (buffer.front + 1) % SIZE;
- if(0 != pthread_mutex_unlock(&mutex))
- {
- perror("pthread_mutex_lock_0");
- exit(1);
- }
- if(0 != sem_post(&write_sem))
- {
- perror("sem_wait_0");
- exit(1);
- }
- sleep(10);
- }
- }
- int main(void)
- {
- //初始化循环队列结构体
- int i;
- bufferbuffer.front = buffer.rear = 0;
- for(i=0; i < SIZE; i++)
- {
- buffer.buf[i] =(char*) malloc(STR_SIZE);
- }
- //初始化 互斥锁
- //存在警告 pthread_mutexattr_t mutex_attr = PTHREAD_MUTEX_INITIALIZER;
- if(0 != pthread_mutex_init(&mutex, NULL))
- {
- perror("pthread_mutex_init\n");
- exit(1);
- }
- //初始化信号量
- if(0 != sem_init(&read_sem, 0, 0))//linux进程间的信号共享还未能实现,参数PSHARE为0,而且还没有进行写操作没有数据可读,将参数vaule设置为0,进行阻塞
- {
- perror("sem_init_0\n");
- exit(1);
- }
- if(0 != sem_init(&write_sem, 0, 2))
- {
- perror("sem_init_1\n");
- exit(1);
- }
- //创建两个子线程
- pthread_t thd0,thd1;
- if(0 != pthread_create(&thd0,NULL,(void*)thread,NULL))
- {
- perror("pthread_create_0\n");
- exit(1);
- }
- if(0 != pthread_create(&thd1,NULL,(void*)thread,NULL))
- {
- perror("pthread_create_1\n");
- exit(1);
- }
- //进行写入字符操作
- while(1)
- {
- //写信号量阻塞
- if(0 != sem_wait(&write_sem))
- {
- perror("sem_wait_1");
- exit(1);
- }
- //上互斥锁所进行写入操作
- if(0 != pthread_mutex_lock(&mutex))
- {
- perror("pthread_mutex_lock_1");
- exit(1);
- }
- fputs("pls enter 20 character:\n",stdout);
- //读标准输入文件
- if(NULL == fgets(buffer.buf[buffer.rear],STR_SIZE,stdin))
- {
- perror("fgets\n");
- exit(1);
- }
- if(0 == strncmp("end\n",buffer.buf[buffer.rear],3))
- {
- printf("manual exit successfully\n");
- exit(1);
- }
- buffer.rear = (buffer.rear+1)% SIZE;
- //解互斥锁
- if(0 != pthread_mutex_unlock(&mutex))
- {
- perror("pthread_mutex_lock_1");
- exit(1);
- }
- if(0 != sem_post(&read_sem))
- {
- perror("sem_wait_1");
- exit(1);
- }
- sleep(1);
- }
- return 0;
- }
信号
线程
信号量
全局
函数
参数
变量
结构
队列
循环
阻塞
两个
字符
数据
文件
标准
进程
附件
输入
例子
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
如何适应网络技术
集成商和软件开发商的区别
大连网站建设软件开发
亚马逊网络安全工程师
华南x99主板能装服务器内存
python软件开发实战
安徽运营软件开发优势
人人商城 消息提醒数据库
新时达服务器故障代码清除
冰场数据库
国产嵌入式软件开发解决方案
wow服务器ip
golang服务器管理软件
1.8我的世界服务器
国家建立网络安全什么体系
通山县网络安全法
博奥软件开发有限公司
数据库并交差运算条件
服务器代跑模型
网络技术图关键路线怎么计算
lpl助攻数据库
长沙么么哒网络技术有限公司
上海推广网络技术模板规格
6月网络安全
软件开发北滘的公司
软件开发疫情后补班
crm系统什么软件开发的
网络安全法和网络知识手抄报
网络安全管理制度 政府
贪吃蛇如何升级服务器