0

我正在解决一个简单的读者/作家问题。我有 3 个.c文件和 3 个.h文件。

parent.c

#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <semaphore.h>
#include "parent.h"
#include "reader.h"
#include "writer.h"



 int main(){
      printf("Aeeeee ");
      globalVariable = 0;
      readers = 0;  
      max = 25;
      sem_init(&waitSema, 0, 0);
      sem_init(&globalSema, 0, 0);
      sem_init(&rdSema, 0, 0);
      pthread_t * array [max];  
      int mda = 0;
      int i;
      for(i = 0; i < max; i++){
        pthread_t * thr = malloc(sizeof(pthread_t));
        array[i] = thr;
        mda = rand()%100;
        if(mda > 50){
          pthread_create(array[i], NULL, writer, NULL);
        }else{
          pthread_create(array[i], NULL, reader, NULL);
        }
      }

      for(i=0; i<max; i++){
        pthread_join(*array[i], NULL);
      }

   }

reader.c

#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <semaphore.h>
#include "reader.h"
#include "parent.h"

void * reader (void * param){
  sem_wait(&waitSema);
  sem_wait(&rdSema);
  if(readers == 0){
    sem_wait(&globalSema);
  }
  readers++;
  sem_post(&rdSema);
  sem_post(&waitSema);
  printf("Reader : %d\n", globalVariable);
  sem_wait(&rdSema);
  readers--;
  if(readers == 0){
    sem_post(&globalSema);
  }
  sem_post(&rdSema);
}

writer.c

#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <semaphore.h>
#include "writer.h"
#include "parent.h"

void * writer (void * param){
  sem_wait(&waitSema);
  sem_wait(&globalSema);
  sem_post(&waitSema);
  globalVariable++;
  printf("Writer : %d\n", globalVariable);
  sem_post(&globalSema);
}

parent.h

sem_t waitSema;         
sem_t globalSema;       
sem_t rdSema;

int globalVariable;     
int readers;        
int max;

reader.h

void * reader (void * param); 

writer.h

void * writer (void * param);   

我用这个命令编译代码: gcc -pthread parent.c reader.c writer.c -o out,但是当我运行时./out没有任何反应。main函数 fromparent.c不执行。

我想要做的是声明一些全局变量,parent.h以便在所有 3 个.c文件中使用它们。

4

2 回答 2

2

使用extern关键字。

header.h 文件:

  /* notify code that this symbol exists, but isn't declared yet */
  extern int someInt;

.c 文件 1:

  /* declare symbol */
  int someInt = 0;

.c 文件 2:

  #include <header.h>
  /* you can use `someInt` now */
于 2013-03-27T16:25:51.023 回答
0

问题出在信号量初始化中。起初,我将0s 作为信号量的值,因此所有线程最终都无法加入。但是在我将值更改为1s 之后,一切都按原样进行。

sem_init(&waitSema, 0, 1);
sem_init(&globalSema, 0, 1);
sem_init(&rdSema, 0, 1);

谢谢大家的回答。

于 2013-03-27T17:24:58.237 回答