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

IOday6互斥和同步

1:思维导图

2:有一个隧道,长1000m,有一辆高铁,每秒100米,有一辆快车,每秒50m 要求模拟这两列火车通过隧道的场景

#include <stdio.h>
#include <string.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>
#include <unistd.h>

pthread_mutex_t mutex;

void* train(void* arg)
{
    pthread_mutex_lock(&mutex);
    printf("高铁进入隧道\n");
    sleep(1);
    printf("高铁通过隧道\n");
    pthread_mutex_unlock(&mutex);
}

void* car(void* arg)
{
    pthread_mutex_lock(&mutex);
    printf("快车进入隧道\n");
    sleep(2);
    printf("快车通过隧道\n");
    pthread_mutex_unlock(&mutex);
}

int main(int argc, const char *argv[])
{
	pthread_mutex_init(&mutex,NULL);

    pthread_t c,t;
    pthread_create(&t, 0, train, 0); 
    pthread_create(&c, 0, car, 0);
	pthread_detach(c);
	pthread_detach(t);

	while(1);
	return 0;
}

输出结果:

3:有一个隧道,长1000m,有一辆高铁,每秒100米,有一辆快车,每秒50m,有一辆慢车每秒25m 要求模拟这两列火车通过隧道的场景,但是要求高铁最先过隧道,快车其次,慢车最后

#include <stdio.h>
#include <string.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>
#include <unistd.h>

pthread_mutex_t tmutex;
pthread_mutex_t cmutex;
pthread_mutex_t lcmutex;

void* train(void* arg)
{
	while(1)
	{
		pthread_mutex_lock(&tmutex);
		printf("高铁进入隧道\n");
		sleep(1);
		printf("高铁通过隧道\n");
		pthread_mutex_unlock(&cmutex);
	}
}

void* car(void* arg)
{
	while(1)
	{
		pthread_mutex_lock(&cmutex);
		printf("快车进入隧道\n");
		sleep(1);
		printf("快车通过隧道\n");
		pthread_mutex_unlock(&lcmutex);
	}
}

void* lcar(void* arg)
{
	while(1)
	{
		pthread_mutex_lock(&lcmutex);
		printf("慢车进入隧道\n");
		sleep(1);
		printf("慢车通过隧道\n");
		pthread_mutex_unlock(&tmutex);
	}
}

int main(int argc, const char *argv[])
{
	pthread_mutex_init(&tmutex,NULL);
	pthread_mutex_init(&cmutex,NULL);
	pthread_mutex_init(&lcmutex,NULL);
	pthread_mutex_lock(&cmutex);
	pthread_mutex_lock(&lcmutex);

    pthread_t c,t,lc;
    pthread_create(&t, 0, train, 0); 
    pthread_create(&c, 0, car, 0);
    pthread_create(&lc, 0, lcar, 0);
	pthread_detach(c);
	pthread_detach(t);
	pthread_detach(lc);
	
	while(1);
	return 0;
}

输出结果:

4:使用条件变量实现一个生产者消费者模型(pv)模型 生产者线程:每秒生成2个苹果 消费者线程:没3秒消费 5~9个苹果 要求消费者在消费之前一定要有足够的苹果给消费

#include <stdio.h>
#include <string.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>
#include <unistd.h>

#define MAX_APPLES 10

pthread_mutex_t mutex;
pthread_cond_t cond;
int apples = 0;
int consum=0;

void* producer(void* arg) 
{
    while (1)
	{
        pthread_mutex_lock(&mutex);
        while (apples >= consum) 
		{
            pthread_cond_wait(&cond, &mutex);
        }
        apples += 2;
        printf("生产者生产了2个苹果,当前苹果数量:%d\n", apples);
        pthread_cond_signal(&cond);
        pthread_mutex_unlock(&mutex);
        sleep(1);
    }
    return NULL;
}

void* consumer(void* arg)
{
    while (1)
	{
        pthread_mutex_lock(&mutex);
        while (apples < 5)
		{
            pthread_cond_wait(&cond, &mutex);
        }
        consume = 5 + rand() % 5;
        apples -= consume;
        printf("消费者消费了%d个苹果,当前苹果数量:%d\n", consume, apples);
        pthread_cond_signal(&cond);
        pthread_mutex_unlock(&mutex);
        sleep(3);
    }
    return NULL;
}

int main(int argc, const char *argv[])
{
	pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&cond, NULL);

    pthread_t prod_thread, cons_thread;
    pthread_create(&prod_thread, NULL, producer, NULL);
    pthread_create(&cons_thread, NULL, consumer, NULL);

    pthread_join(prod_thread, NULL);
    pthread_join(cons_thread, NULL);

    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);
	return 0;
}


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

相关文章:

  • nacos环境搭建以及SpringCloudAlibaba脚手架启动环境映射开发程序
  • vLLM私有化部署大语言模型LLM
  • Maven 在尝试连接到 Maven Central 仓库超时的解决方案和排查步骤
  • 在 Ubuntu 上安装和配置 Redis
  • MySQL的安装
  • 跨境电商领域云手机之选:亚矩阵云手机的卓越优势
  • 《拉依达的嵌入式\驱动面试宝典》—操作系统篇(七)
  • 完全二叉树的顺序存储【堆】
  • [c#] 度分秒和度的转换
  • 轨迹优化 | 基于贝塞尔曲线的无约束路径平滑与粗轨迹生成(附ROS C++/Python仿真)
  • 嵌入式系统中的 OpenCV 与 OpenGLES 协同应用
  • 【C】初阶数据结构3 -- 单链表
  • maven高级(day15)
  • 安装虚拟机VMware遇到的问题
  • JAVA安全编码规范
  • 七 rk3568 android 11 ec20 4G驱动移植
  • EasyControl:首个登陆AWS Marketplace的中国MDM先锋
  • electron 上怎么用node 调用 c++ 提供的方法
  • 深度学习模型适应两种不同的正态分布
  • STM32 FreeRTOS移植
  • 《Java核心技术II》并行流
  • Centos 宝塔安装
  • system generator 使用高版本的matlab
  • 【大数据】机器学习------神经网络模型
  • Go oom分析(一)——使用pprof线上分析
  • element ui前端小数计算精度丢失的问题如何解决?