Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我收到信号灯的警告_C_Linux_Operating System_Pthreads - Fatal编程技术网

C 我收到信号灯的警告

C 我收到信号灯的警告,c,linux,operating-system,pthreads,C,Linux,Operating System,Pthreads,所以我在这个项目上工作了一整天,我检查了我的错误,当我修复它们的时候,我来到了最后一部分,那就是警告 我得到的警告是相同的:从兼容指针类型[默认情况下已启用]传递“”的参数1 注意:应为“union sem_t*”,但参数的类型为“void*()(void)” 请帮帮我。我已经在这个问题上纠缠了好几个小时了。提前谢谢 我在顾客和理发店都从sem_init上取下了&但它不起作用 #include <unistd.h> //Provides API for POSIX(or UN

所以我在这个项目上工作了一整天,我检查了我的错误,当我修复它们的时候,我来到了最后一部分,那就是警告

我得到的警告是相同的:从兼容指针类型[默认情况下已启用]传递“”的参数1 注意:应为“union sem_t*”,但参数的类型为“void*()(void)”

请帮帮我。我已经在这个问题上纠缠了好几个小时了。提前谢谢

我在顾客和理发店都从sem_init上取下了&但它不起作用

    #include <unistd.h> //Provides API for POSIX(or UNIX) OS for system calls
    #include <stdio.h> //Standard I/O Routines
    #include <stdlib.h> //For exit() and rand()
    #include <pthread.h> //Threading APIs
    #include <semaphore.h> //Semaphore APIs

    #define MAX 30 //Maximum no. of customers for simulation
    #define MAX_BARBERS 1000

    sem_t customer; //Semaphore
    sem_t barber; //Semaphore
    sem_t mutex; //Semaphore for providing mutially exclusive access

    void *barbers(void *param); //Thread Function
    void *customers(void *param); //Thread Function

    int num_chairs;
    int barbers_total;
    int customers_total;
    int serveMeNext; //Index to choose a candidate for cutting hair

    void wait(); //Randomized delay function

    int main(int argc, char *argv[]){

      pthread_t barberid[MAX_BARBERS];
      pthread_t customerid[MAX]; //Thread declaration
      int i = 0;

      if(argc != 4){
        printf("Enter 3 arguments (Number of chairs, barbers, customers)\n");
        exit(0);
      }

      num_chairs = atoi(argv[1]);
      barbers_total = atoi(argv[2]);
      customers_total = atoi(argv[3]);
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
      /*Semaphore initialization*/
      sem_init(&mutex,0,1);
      sem_init(customers,0,0);
      sem_init(barbers,0,0);
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
      /*Barber thread initialization*/
      printf("!!Barber Shop Opens!!\n");

      for(i = 0; i <= barbers_total; i++){ //Creation of barbers    
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
         pthread_create(&barberid[i], NULL, barbers, (void*)&i);
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
         sleep(1);
      }

      /*Customer thread initialization*/
      for(i = 0; i <= customers_total; i++){ //Creation of Customer Threads 
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''  
         pthread_create(&customerid[i],NULL,customers,(void*)&i);
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
         wait(); //Create customers in random interval
      }
      for(i = 0; i <= MAX; i++) //Waiting till all customers are dealt with

       pthread_join(customerid[i],NULL);
       printf("!!Barber Shop Closes!!\n");
       exit(EXIT_SUCCESS);  //Exit abandoning infinite loop of barber thread
    }

    void *customers(void *param){ /*Customer Process*/

      int mySeat, B;
      static int count = 0; //Counter of No. of customers
      int numberOfFreeSeats = num_chairs; //Counter for Vacant seats in waiting room
      int seatPocket[num_chairs]; //To exchange pid between customer and barber
      int sitHereNext = 0; //Index for next legitimate seat
      serveMeNext = 0;
      sem_wait(&mutex); //Lock mutex to protect seat changes
      count++; //Arrival of customer

      printf("Customer-%d entered shop. ",count);

      if(numberOfFreeSeats > 0){
          --numberOfFreeSeats; //Sit on chairs on waiting room

        printf("Customer-%d Sits In Waiting Room.\n",count);

        sitHereNext = (++sitHereNext) % num_chairs; //Choose a vacant chair to sit

        mySeat = sitHereNext;
        seatPocket[mySeat] = count;

        sem_post(&mutex); //Release the seat change mutex
        sem_post(barbers); //Wake up one barber
        sem_wait(customers); //Join queue of sleeping customers
        sem_wait(&mutex); //Lock mutex to protect seat changes

        B = seatPocket[mySeat]; //Barber replaces customer PID with his own PID

        numberOfFreeSeats++; //Stand Up and Go to Barber Room

        sem_post(&mutex); //Release the seat change mutex
        /*Customer is having hair cut by barber 'B'*/
      }else{
        sem_post(&mutex); //Release the mutex and customer leaves without haircut  
        printf("Customer-%d Finds No Seat & Leaves.\n",count);
      }
      pthread_exit(0);
    }

    void *barbers(void *param){ /*Barber Process*/

      int index = *(int *)(param);
      int myNext, C;
      int worktime;
      int seatPocket[num_chairs]; //To exchange pid between customer and barber  

      printf("Barber-%d joins shop. ",index);

      while(1){ /*Infinite loop*/
        printf("Barber-%d Gone To Sleep.\n",index);

        sem_wait(barbers); //Join queue of sleeping barbers
        sem_wait(&mutex); //Lock mutex to protect seat changes

        serveMeNext = (++serveMeNext) % MAX; //Select next customermyNext = serveMeNext;

        C = seatPocket[myNext]; //Get selected customer's PID
        seatPocket[myNext] = pthread_self(); //Leave own PID for customer

        sem_post(&mutex);
        sem_post(customers); //Call selected customer

       /*Barber is cutting hair of customer 'C'*/
        printf("Barber-%d Wakes Up & Is Cutting Hair Of Customer-%d.\n",index,C);
        worktime = (rand() % 3) + 1;
        printf("Barber-%d Finished.\n",index);
        sleep(worktime);
      }
    }

    void wait(){ /*Generates random number between 50000 to 250000*/
      int x = rand() % (250000 - 50000 + 1) + 50000;
      srand(time(NULL));
      usleep(x); //usleep halts execution in specified miliseconds
    }
#include//为POSIX(或UNIX)操作系统提供用于系统调用的API
#包括//标准I/O例程
#包含//用于exit()和rand()的值
#包括//线程API
#include//信号量api
#定义最多30//模拟的最大客户数
#定义最大理发师1000人
扫描客户//信号量
理发师//信号量
sem_t互斥体//提供多排他访问的信号量
void*理发师(void*param)//线程函数
作废*客户(作废*参数)//线程函数
int num_椅子;
国际理发师总人数;
国际客户总数;
int servementext//选择剪发候选对象的索引
无效等待()//随机延迟函数
int main(int argc,char*argv[]){
pthread_t barberid[MAX_BARBERS];
pthread_t customerid[MAX];//线程声明
int i=0;
如果(argc!=4){
printf(“输入3个参数(椅子、理发师、客户的数量)\n”);
出口(0);
}
num_chairs=atoi(argv[1]);
barbers_total=atoi(argv[2]);
客户总数=atoi(argv[3]);
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
/*信号量初始化*/
sem_init(&mutex,0,1);
sem_init(客户,0,0);
sem_init(barbers,0,0);
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
/*理发线程初始化*/
printf(“理发店开门!!\n”);

对于警告中的(i=0;i),很明显您传递的是指向函数的指针,而不是它所期望的
sem\t
类型

您似乎对
customer
barber
有输入错误

sem_init
必须

sem_init(&customer,0,0);      
sem_init(&barber,0,0);
sem_post(&customer);
sem_post(&barber);

您的
sem_post
必须

sem_init(&customer,0,0);      
sem_init(&barber,0,0);
sem_post(&customer);
sem_post(&barber);


另外,不要忘记使用
-lpthread
-pthread
编译此文件。从警告中可以看出,您传递的是指向函数的指针,而不是它所期望的
sem\t
类型

您似乎对
customer
barber
有输入错误

sem_init
必须

sem_init(&customer,0,0);      
sem_init(&barber,0,0);
sem_post(&customer);
sem_post(&barber);

您的
sem_post
必须

sem_init(&customer,0,0);      
sem_init(&barber,0,0);
sem_post(&customer);
sem_post(&barber);


另外,不要忘了用
-lpthread
-pthread

customer
vs
customers
barber
vs
barbers
扫描互斥体;
现在,考虑到互斥体是一种实际的对象类型,这很容易混淆…
等等(2)
恰好是系统调用的名称。可能您有一些与此事实相关的未定义行为。我不打算投票结束此问题,但您需要尝试在您的C项目中不使用标准库函数名,主要是在它们与线程相关的情况下。您需要发布一个完整、最小且可验证的程序am,不是代码片段。请阅读并编辑您的问题,或重新发帖。另外,
exit(2)
是另一个系统调用,它会结束您的整个程序,而不仅仅是您正在运行的线程。因此,请使用
pthread\u exit()
和/或
pthread\u join()
来同步线程终止。不要使用
exit(2)
customer
vs
customers
barber
vs
barbers
扫描互斥体;
鉴于互斥体是一种实际的对象类型,现在这很令人困惑…
wait(2)
恰好是系统调用的名称。可能您有一些与此事实相关的未定义行为。我不打算投票结束此问题,但您需要尝试在您的C项目中不使用标准库函数名,主要是在它们与线程相关的情况下。您需要发布一个完整、最小且可验证的程序am,不是代码片段。请阅读并编辑您的问题,或重新发帖。另外,
exit(2)
是另一个系统调用,它会结束您的整个程序,而不仅仅是您正在运行的线程。因此,请使用
pthread\u exit()
和/或
pthread\u join()
来同步线程终止。不要使用
exit(2)
在线程中终止它。