我正在解决一个简单的读者/作家问题。我有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
文件中使用它们。
答案 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);
感谢大家的回答。