当前位置: 首页 > news >正文

【操作系统】Linux之线程同步二(头歌作业)

第1关:信号量

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>//全局信号量  sem1已被初始化为1,sem2被初始化为0
extern sem_t sem1, sem2;//全局共享变量
extern char *ch;/************************* 参数arg: 是线程函数的参数
*************************/
void *ThreadHandler1(void *arg)
{int i = 0;for(i = 0; i < 3; i++){/********** BEGIN **********/sem_wait(&sem1);/********** END **********/printf("%c", *ch);usleep(100);ch++;/********** BEGIN **********/sem_post(&sem2);/********** END **********/}pthread_exit(NULL);
}
/************************* 参数arg: 是线程函数的参数
*************************/
void *ThreadHandler2(void *arg)
{int i = 0;for(i = 0; i < 3; i++){/********** BEGIN **********/sem_wait(&sem2);/********** END **********/printf("%c", *ch);ch++;/********** BEGIN **********/sem_post(&sem1);/********** END **********/}pthread_exit(NULL);
}

第2关:读写锁

#include <stdio.h>
#include <pthread.h>//全局读写锁
extern pthread_rwlock_t rwlock;//全局共享变量
extern char buffer[3];
extern int position;/************************* 参数arg: 是线程函数的参数
*************************/
void *ReadHandler(void *arg)
{int i;for(i = 0; i < 3; i++){/********** BEGIN **********/pthread_rwlock_rdlock(&rwlock);/********** END **********/printf("%c\n", buffer[i]);/********** BEGIN **********/pthread_rwlock_unlock(&rwlock);/********** END **********/usleep(800);}pthread_exit(NULL);
}/************************* 参数arg: 是线程函数的参数
*************************/
void *WriteHandler(void *arg)
{/********** BEGIN **********/pthread_rwlock_wrlock(&rwlock);/********** END **********/buffer[position] = *(char*)arg;sleep(1);position++;/********** BEGIN **********/pthread_rwlock_unlock(&rwlock);/********** END **********/pthread_exit(NULL);
}

第3关:项目实战

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>//记录读线程的个数
extern int reader;//全局的信号量变量
extern sem_t sem_read, sem_write;//读写锁初始化函数
void sem_rwlock_init()
{reader = 0;//初始化信号量个1sem_init(&sem_read, 0, 1);sem_init(&sem_write, 0, 1);
}//读写锁注销函数
void sem_rwlock_destroy()
{sem_destroy(&sem_read);sem_destroy(&sem_write);
}//读模式下的加锁操作
void sem_rwlock_rdlock()
{//读模式下加锁操作/********** BEGIN **********/sem_wait(&sem_read);if (reader == 0){sem_wait(&sem_write); // 第一个读者要去读取数据,禁止写者进行写数据操作}reader++;sem_post(&sem_read);/********** END **********/
}//读模式下的解锁操作
void sem_rwlock_unrdlock()
{//读模式下解锁操作/********** BEGIN **********/sem_wait(&sem_read);reader--;if (reader == 0){sem_post(&sem_write); // 当读者数量为0时,允许写者进行写数据}sem_post(&sem_read);/********** END **********/
}//写模式下的加锁操作
void sem_rwlock_wrlock()
{sem_wait(&sem_write);
}//写模式下的解锁操作
void sem_rwlock_unwrlock()
{sem_post(&sem_write);
}


http://www.mrgr.cn/news/74810.html

相关文章:

  • VUE3+Three.js搭建教程
  • VScode下脚本被禁止运行的原因及解决方案
  • 网络远程操控
  • C语言数据结构与算法--简单实现队列的入队和出队
  • 2.操作系统常见面试问题3
  • 地区级的可视化地图不设计,进来看看超炫的样式吧
  • 前端开发设计模式——责任链模式
  • 在Windows上收发PGP加密电子邮件
  • React Hooks 快速入门指南
  • 介绍一下,Stable Diffusion!文生图的稳定之选
  • asp.net framework下webform、webapi和mvc对于文件增加权限校验
  • Leetcode 整数转罗马数字
  • error: unrecognized arguments: --port
  • 新能源汽车关键技术技能大赛理论知识竞赛题库
  • 一文简单了解Android中的input流程
  • ospf排错学习
  • 分清数据链路层、网络层、传输层的区别,以及这些层面的代表协议
  • 计算机文件msvcp100.dll丢失原因以及5种解决方法详解分享
  • macOS系统下使用SQLark连接达梦数据库
  • 探索大型语言模型(LLMs)能否在不泄露私人信息的情况下联合其他大型语言模型共同解决问题
  • 从前端react动画引发到计算机底层的思考
  • 【图像压缩感知】论文阅读:Self-supervised Scalable Deep Compressed Sensing
  • Process finished with exit code 137 (interrupted by signal 9: SIGKILL)
  • 【Bluedroid】A2dp初始化流程源码分析
  • 重学 Android 自定义 View 系列(六):环形进度条
  • 达梦数据库迁移j脚本