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

IO进程寒假作业DAY6

请使用互斥锁 和 信号量分别实现5个线程之间的同步

使用互斥锁

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
//创建锁
pthread_mutex_t m1;
pthread_mutex_t m2;
pthread_mutex_t m3;
pthread_mutex_t m4;
pthread_mutex_t m5;

void *task1(void *arg)
{
	while(1)
	{
		pthread_mutex_lock (&m1);
		printf("线程1\n");
		sleep(1);
		pthread_mutex_unlock (&m2);
	}
}

void *task2(void *arg)
{
	while(1)
	{
		pthread_mutex_lock (&m2);
		printf("线程2\n");
		sleep(1);
		pthread_mutex_unlock (&m3);
	}
}

void *task3(void *arg)
{
	while(1)
	{
		pthread_mutex_lock (&m3);
		printf("线程3\n");
		sleep(1);
		pthread_mutex_unlock (&m4);
	}
}

void *task4(void *arg)
{
	while(1)
	{
		pthread_mutex_lock (&m4);
		printf("线程4\n");
		sleep(1);
		pthread_mutex_unlock (&m5);
	}
}

void *task5(void *arg)
{
	while(1)
	{
		pthread_mutex_lock (&m5);
		printf("线程5\n");
		sleep(1);
		pthread_mutex_unlock (&m1);
	}
}

int main(int argc, const char *argv[])
{//请使用互斥锁 和 信号量分别实现5个线程之间的同步	
	//初始化锁
	pthread_mutex_init(&m1,NULL);
	pthread_mutex_init(&m2,NULL);
	pthread_mutex_init(&m3,NULL);
	pthread_mutex_init(&m4,NULL);
	pthread_mutex_init(&m5,NULL);
	//上锁分支线程中的锁
	pthread_mutex_lock(&m2);
	pthread_mutex_lock(&m3);
	pthread_mutex_lock(&m4);
	pthread_mutex_lock(&m5);
	//创建线程id
	pthread_t id1,id2,id3,id4,id5;
	//创建线程
	pthread_create(&id1,0,task1,0);
	pthread_create(&id2,0,task2,0);
	pthread_create(&id3,0,task3,0);
	pthread_create(&id4,0,task4,0);
	pthread_create(&id5,0,task5,0);
	//设置分离属性
	pthread_detach(id1);
	pthread_detach(id2);
	pthread_detach(id3);
	pthread_detach(id4);
	pthread_detach(id5);

	task1(NULL);
	return 0;
}

运行现象

使用信号量

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
//创建信号量变量
sem_t s1;
sem_t s2;
sem_t s3;
sem_t s4;
sem_t s5;

void *task1(void *arg)
{
	while(1)
	{
		sem_wait (&s1);
		printf("线程1\n");
		sleep(1);
		sem_post (&s2);	
	}
}

void *task2(void *arg)
{
	while(1)
	{
		
		sem_wait (&s2);
		printf("线程2\n");
		sleep(1);	
		sem_post (&s3);	
	}
}

void *task3(void *arg)
{
	while(1)
	{
		sem_wait (&s3);
		printf("线程3\n");
		sleep(1);
		sem_post (&s4);
	}
}

void *task4(void *arg)
{
	while(1)
	{
		sem_wait (&s4);
		printf("线程4\n");
		sleep(1);
		sem_post (&s5);
	}
}

void *task5(void *arg)
{
	while(1)
	{
		sem_wait (&s5);
		printf("线程5\n");
		sleep(1);
		sem_post(&s1);
		
	}
}

int main(int argc, const char *argv[])
{//请使用互斥锁 和 信号量分别实现5个线程之间的同步	
	//初始化信号量
	sem_init(&s1,0,1);
	sem_init(&s2,0,0);
	sem_init(&s3,0,0);
	sem_init(&s4,0,0);
	sem_init(&s5,0,0);
	
	//创建线程id
	pthread_t id1,id2,id3,id4,id5;
	//创建线程
	pthread_create(&id1,0,task1,0);
	pthread_create(&id2,0,task2,0);
	pthread_create(&id3,0,task3,0);
	pthread_create(&id4,0,task4,0);
	pthread_create(&id5,0,task5,0);
	//设置分离属性
	pthread_detach(id1);
	pthread_detach(id2);
	pthread_detach(id3);
	pthread_detach(id4);
	pthread_detach(id5);

	task1(NULL);
	return 0;
}

 运行现象


http://www.kler.cn/a/523885.html

相关文章:

  • Windows11无法打开Windows安全中心主界面
  • 用HTML、CSS和JavaScript实现庆祝2025蛇年大吉(附源码)
  • YOLOv11-ultralytics-8.3.67部分代码阅读笔记-head.py
  • 【C语言练习题】找出不是两个数组共有的元素
  • 51单片机开发:独立键盘实验
  • JavaScript_02 表单
  • 洛谷U525322 优美区间
  • PHP EOF (Heredoc) 详解
  • 《多阶段渐进式图像修复》学习笔记
  • centos7安装SVN
  • Unity游戏(Assault空对地打击)开发(1) 创建项目和选择插件
  • LCD液晶屏的工作原理以及背光模组
  • 揭示Baklib企业内容管理系统CMS的核心功能与应用价值
  • 【Rust自学】16.3. 共享状态的并发
  • 学历赋
  • 动态规划DP 数字三角形模型(模型分析+例题分析+C++代码实现)(数字三角形、摘花生、最低通行费用、方格取数、传纸条)
  • 物联网工程与网络工程到底有什么关系?
  • 探索人工智能在计算机视觉领域的创新应用与挑战
  • games101-作业
  • 国内外大语言模型领域发展现状与预期
  • 硬件学习笔记--35 AD23的使用常规操作
  • HTB:Forest[WriteUP]
  • 算法随笔_19: 数组中的最长山脉
  • DeepSeek助力学术文献搜索!
  • 安装VMware17
  • SQL进阶实战技巧:如何构建用户行为转移概率矩阵,深入洞察会话内活动流转?