kandan_cc 2022-05-24 14:19 采纳率: 80%
浏览 63
已结题

Linux中用gcc编译程序不成功报错怎么解决?

哲学家进餐问题,在Windows中用Dev就可以正常运行,然后一到Linux中编译就通过不了,刚学Linux不知道怎么解决,求看看如何解决

img


#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>

#define N 5

sem_t chopsticks[N];//设置5种信号量,有5种不同类型的资源,每一种有1个,这样便于理解,因为每个哲学家需要的资源不同

pthread_mutex_t mutex;//定义互斥锁

int philosophers[N] = {0, 1, 2, 3, 4};//代表5个哲学家的编号

void delay (int len) {
    int i = rand() % len;
    int x;
    while (i > 0) {
        x = rand() % len;
        while (x > 0) {
            x--;
        }
        i--;
    }
}

void *philosopher (void* arg) {
    int i = *(int *)arg;
    int left = i;//左筷子的编号和哲学家的编号相同
    int right = (i + 1) % N;//右筷子的编号为哲学家编号+1
    int mn=2;
    while (mn) {
        printf("哲学家%d正在思考问题\n", i);
        delay(60000);

        printf("哲学家%d饿了\n", i);

        pthread_mutex_lock(&mutex);//加锁

        sem_wait(&chopsticks[left]);//此时这个哲学家左筷子的信号量-1之后>=0时,表示能继续执行。
        printf("哲学家%d拿起了%d号筷子,现在只有一支筷子,不能进餐\n", i, left);
        sem_wait(&chopsticks[right]);
        printf("哲学家%d拿起了%d号筷子\n", i, right);

        pthread_mutex_unlock(&mutex);//解锁

        printf("哲学家%d现在有两支筷子,开始进餐\n", i);
        delay(60000);
        sem_post(&chopsticks[left]);
        printf("哲学家%d放下了%d号筷子\n", i, left);
        sem_post(&chopsticks[right]);
        printf("哲学家%d放下了%d号筷子\n", i, right);
        mn--;
    }
}

int main (int argc, char **argv) {
    srand(time(NULL));
    pthread_t philo[N];

    //信号量初始化
    for (int i=0; i<N; i++) {
        sem_init(&chopsticks[i], 0, 1);
    }

    pthread_mutex_init(&mutex,NULL);//初始化互斥锁

    //创建线程
    for (int i=0; i<N; i++) {
        pthread_create(&philo[i], NULL, philosopher, &philosophers[i]);
    }

    //挂起线程
    for (int i=0; i<N; i++) {
        pthread_join(philo[i], NULL);
    }

    //销毁信号量
    for (int i=0; i<N; i++) {
        sem_destroy(&chopsticks[i]);
    }

    pthread_mutex_destroy(&mutex);//销毁互斥锁

    return 0;
}
  • 写回答

1条回答 默认 最新

  • 张十五 2022-05-24 14:33
    关注

    pthread库需要自己指明,,命令加个 -lpthread 就可以了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月1日
  • 已采纳回答 5月24日
  • 创建了问题 5月24日

悬赏问题

  • ¥15 python动态规划:N根火柴摆出的最大数字
  • ¥20 (标签-excel)
  • ¥200 求idea10和MyEclipse7.1
  • ¥20 vb6.0截取当前窗体保存为jpg文件
  • ¥20 苹果手机不使用大疆sdk怎么获取遥控器控制信息或如何接入大疆sdk并且成功上架sdk
  • ¥20 woocommerce 注册按键重定向
  • ¥100 求书法图像文字切割代码
  • ¥15 同一个波形探测距离不同的目标,为什么fft之后得到的频谱图会发生移动,不应该时移不改变幅度谱吗(标签-matlab)(相关搜索:matlab仿真)
  • ¥15 Proteus仿真程序只能执行一次
  • ¥15 语音识别websocket报错