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

1.31 实现五个线程的同步

1.使用互斥锁实现

1>程序代码
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.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 m;
pthread_mutex_t m1;
pthread_mutex_t m2;
pthread_mutex_t m3;
pthread_mutex_t m4;

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

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

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

void* thread_main4(void* arg)
{
	while(1)
	{
		pthread_mutex_lock(&m4);
		printf("4#线程\n");
		printf("-------------\n");
		sleep(1);
		pthread_mutex_unlock(&m);
	}
}

int main(int argc, const char *argv[])
{
	//初始化互斥锁
	pthread_mutex_init(&m,NULL);
	pthread_mutex_init(&m1,NULL);
	pthread_mutex_init(&m2,NULL);
	pthread_mutex_init(&m3,NULL);
	pthread_mutex_init(&m4,NULL);

	pthread_mutex_lock(&m1);
	pthread_mutex_lock(&m2);
	pthread_mutex_lock(&m3);
	pthread_mutex_lock(&m4);

	//创建4个分支线程
	pthread_t id1;
	pthread_create(&id1,0,thread_main1,0);
	pthread_detach(id1);
	pthread_t id2;
	pthread_create(&id2,0,thread_main2,0);
	pthread_detach(id2);
	pthread_t id3;
	pthread_create(&id3,0,thread_main3,0);
	pthread_detach(id3);
	pthread_t id4;
	pthread_create(&id4,0,thread_main4,0);
	pthread_detach(id4);

	//主线程
	while(1)
	{
		pthread_mutex_lock(&m);
		printf("主线程\n");
		sleep(1);
		pthread_mutex_unlock(&m1);
	}

	//销毁互斥锁
	pthread_mutex_destroy(&m);
	pthread_mutex_destroy(&m1);
	pthread_mutex_destroy(&m2);
	pthread_mutex_destroy(&m3);
	pthread_mutex_destroy(&m4);
	return 0;
}
2>运行效果

2.使用信号量实现

1>程序代码
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.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 s;
sem_t s1;
sem_t s2;
sem_t s3;
sem_t s4;

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

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

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

void* thread_main4(void* arg)
{
	while(1)
	{
		sem_wait(&s4);
		printf("4#线程\n");
		printf("----------------\n");
		sleep(1);
		sem_post(&s);
	}
}

int main(int argc, const char *argv[])
{
	//初始化信号量
	sem_init(&s,0,1);
	sem_init(&s1,0,1);
	sem_init(&s2,0,1);
	sem_init(&s3,0,1);
	sem_init(&s4,0,1);

	sem_wait(&s1);
	sem_wait(&s2);
	sem_wait(&s3);
	sem_wait(&s4);

	//创建4个分支线程
	pthread_t id1;
	pthread_create(&id1,0,thread_main1,0);
	pthread_detach(id1);
	pthread_t id2;
	pthread_create(&id2,0,thread_main2,0);
	pthread_detach(id2);
	pthread_t id3;
	pthread_create(&id3,0,thread_main3,0);
	pthread_detach(id3);
	pthread_t id4;
	pthread_create(&id4,0,thread_main4,0);
	pthread_detach(id4);

	//销毁信号量
	sem_destroy(&s);
	sem_destroy(&s1);
	sem_destroy(&s2);
	sem_destroy(&s3);
	sem_destroy(&s4);

	//主线程
	while(1)
	{
		sem_wait(&s);
		printf("主线程\n");
		sleep(1);
		sem_post(&s1);
	}

	return 0;
}
2>运行效果


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

相关文章:

  • 在godot中接入大模型api,实现npc的自动对话
  • 前端学习-事件委托(三十)
  • android主题设置为..DarkActionBar.Bridge时自定义DatePicker选中日期颜色
  • UE5 GAS RPG Character Classes
  • Fiddler(一) - Fiddler简介_fiddler软件
  • Agent 高频知识汇总:查漏补缺参考大全
  • 前端知识速记—JS篇:箭头函数
  • 力扣hot100--2
  • 比较器使用
  • FIDL:Flutter与原生通讯的新姿势,不局限于基础数据类型
  • 剑指offer 字符串 持续更新中...
  • 使用Pygame制作“动态烟花”
  • 基于互联网+智慧水务信息化整体解决方案
  • unity学习25:用 transform 进行旋转和移动,简单的太阳地球月亮模型,以及父子级关系
  • 【Pandas】pandas Series diff
  • C语言指针专题二 -- 字符指针与字符串
  • 翻译: Anthropic CEO:DeepSeek-R1是人工智能领域的革命吗?二
  • 一文读懂fgc之cms
  • web安全测试之 xss攻击_request
  • [openwrt] odhcpd ra_management Vs ra_flags 和 ra_slaac
  • 守护进程
  • 代码随想录34 动态规划
  • C动态库的生成与在Python和QT中的调用方法
  • 猿人学web 19题(js逆向)
  • 为AI聊天工具添加一个知识系统 之70 详细设计 之11 维度运动控制的应用:上下文受控的自然语言
  • Git进阶之旅:Git 分支管理