C语言实现哲学家(信号量和锁)问题

代码如下:

#include<stdio.h>
#include<pthread.h>
#include<semaphore.h>

#define N 5
sem_t chopsticks[N];
sem_t r;
int philosophers[N] = {0,1,2,3,4};

pthread_mutex_t mutex[N];



void *philosophe1(void *arg)
{
    int i = *(int *)arg;
    int left = i;
    int right = (i+1)%N;
    while(1)
    {
        printf("哲学家%d正在思考问题\n",i);
        sleep(1);
        printf("哲学家%d饿了\n",i);

        if(i % 2 == 0)
        {
            sem_wait(&chopsticks[right]);
            printf("哲学家%d拿起了%d号筷子,现在只有一支筷子,不能进餐\n",i,right);
            sem_wait(&chopsticks[left]);
            printf("哲学家%d拿起了%d号筷子, 现在有两支筷子,开始进餐\n", i, left);
            sleep(3);
            sem_post(&chopsticks[left]);
            printf("哲学家%d放下了%d号筷子\n", i, left);
            sem_post(&chopsticks[right]);
            printf("哲学家%d放下了%d号筷子\n", i, right);
        }
        else
        {
            s
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
哲学家问题可以使用信号量解决。下面是一个使用 C 语言编写哲学家问题解决方案: ```c #include <stdio.h> #include <pthread.h> #include <semaphore.h> #define N 5 // 哲学家的数量 #define LEFT (i + N - 1) % N // 左边的哲学家编号 #define RIGHT (i + 1) % N // 右边的哲学家编号 sem_t chopsticks[N]; // 信号量数组,表示筷子的状态 sem_t mutex; // 互斥信号量,保证哲学家就餐的互斥 void *philosopher(void *arg) { int i = *(int *)arg; int left = LEFT; int right = RIGHT; while (1) { // 哲学家思考 printf("Philosopher %d is thinking.\n", i); // 等待左边的筷子 sem_wait(&chopsticks[left]); // 等待右边的筷子 sem_wait(&chopsticks[right]); // 获取互斥 sem_wait(&mutex); // 哲学家就餐 printf("Philosopher %d is eating.\n", i); // 释放互斥 sem_post(&mutex); // 放下左边的筷子 sem_post(&chopsticks[left]); // 放下右边的筷子 sem_post(&chopsticks[right]); } } int main() { pthread_t tid[N]; int index[N]; // 初始化互斥信号量 sem_init(&mutex, 0, 1); // 初始化筷子信号量 for (int i = 0; i < N; i++) { sem_init(&chopsticks[i], 0, 1); } // 创建哲学家线程 for (int i = 0; i < N; i++) { index[i] = i; pthread_create(&tid[i], NULL, philosopher, &index[i]); } // 等待哲学家线程结束 for (int i = 0; i < N; i++) { pthread_join(tid[i], NULL); } // 销毁信号量 sem_destroy(&mutex); for (int i = 0; i < N; i++) { sem_destroy(&chopsticks[i]); } return 0; } ``` 在这个代码中,我们使用了一个互斥信号量 `mutex` 来保证哲学家之间的就餐互斥。每个哲学家都需要先获取左边的筷子,再获取右边的筷子,然后才能进餐。如果一个筷子被其他哲学家占用,则当前哲学家会等待,直到可以获取到筷子。就餐完成后,哲学家会先放下左边的筷子,再放下右边的筷子,然后继续思考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值