unix 互斥锁与信号量应用例子
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,#include#include #include #include #include #include #define SIZE 3#define STR_SIZE 20pthread_mutex_
千家信息网最后更新 2026年11月01日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安全错误
数据库的锁怎样保障安全
南京欣网互联网络科技有限公司
互联网科技工作委员会主任
科技创新与互联网经济
互联网络科技有限公司
为想互联网科技
互联网科技论坛
互联网科技汛
互联网科技英文翻译
互联网企业和科技型企业
湖南诚度互联网科技有限公司
互联网科技创新服务
互联网金融中的现代科技
民营互联网公司国防科技
四川慕妮娅互联网科技有限公司
用友工业互联网科技发展
互联网科技大赛获奖感言
互联网科技包装股份有限公司上市
互联网科技和医药行业
安徽零酒互联网科技有限公司
科技互联网公司两年变化
互联网科技产业
重生之互联网科技帝国
智能科技公司是互联网公司吗
互联网科技公司怎么样
四川狮子座互联网科技
云创客互联网科技公司
中国科技互联网公司收入
河南猎农互联网科技有限公司
下一代互联网重大应用科技园
互联网时代科技型公司的机会