unix 互斥锁与信号量应用例子
发表于:2025-02-08 作者:千家信息网编辑
千家信息网最后更新 2025年02月08日,#include#include #include #include #include #include #define SIZE 3#define STR_SIZE 20pthread_mutex_
千家信息网最后更新 2025年02月08日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安全错误
数据库的锁怎样保障安全
uc网页显示无法验证服务器身份
移动软件开发大赛
财务软件开发思路
java桌面版软件开发
数据库密码安全要求
孝感网络安全采购
香港最稳定服务器
联通华盛软件开发
泉州软件开发培训机构哪家好
专科计算机网络技术技能大赛
服务器远程桌面管理关闭
中国饲料数据库官网怎么打不开
党组网络安全工作责任制落实情况
字节跳动服务器内存采购额
巴音郭楞软件开发平均价格
数据库可以查询学位论文吗
python把图片存放到数据库
万方数据库知网空间
如何建立数据库mytest
收到软件开发费会计分录
内蒙古软件开发服务应用
服务器与路由器
网络安全需破除什么思维
我的世界服务器账号信息在
刘文洋数据库技术pdf
简单设计php数据库系统
广播电视网络安全自查
万芳数据库属于网络信息吗
衡水廊坊管家婆网络技术
python把图片存放到数据库