在C中包含和链接

时间:2013-03-27 16:23:33

标签: c compilation linker pthreads header-files

我正在解决一个简单的读者/作家问题。我有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中的parent.c函数无法执行。

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

2 个答案:

答案 0 :(得分: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 */

答案 1 :(得分:0)

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

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

感谢大家的回答。