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関数parent.cは実行されません。

私がやりたいことは、3 つのファイルparent.hすべてで使用するために、いくつかのグローバル変数を宣言することです。.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

問題はセマフォの初期化にありました。最初は0、セマフォに値として s を指定しましたが、そのため、最終的にすべてのスレッドが参加できませんでした。しかし、値を1s に変更した後、すべてが正常に機能しました。

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

回答ありがとうございます。

于 2013-03-27T17:24:58.237 に答える