2016-10-30 8 views
0

フォールト私は、グローバルセマフォ配列を宣言した:デバッグがで間違った何かを明らかにしたセマフォの配列としてワンセグ

for(int x = 0; x<11; x++) 
    sem_init(exiting_on[x], 0, 0); 

sem_t *exiting_on[11]; 

として、メインでそれを初期化しようとすると検索の際に私が見つけたすべての例が、まるでそれのように見えるにもかかわらず、ループのために完全に正常な(現れる)。たぶん私は何かが分からない、私は確信していない。私は以下の完全なコードを投稿します(セマフォのための理髪師の問題と同様のエレベーターをシミュレートします)が、まだ実行することはできませんでしたので、他のエラーが発生する可能性があります。

何かすべてのアドバイスは大歓迎です!これは私にとってはすべて新しいものなので、いつも学びたいと思っています。

#include <pthread.h> 
#include <iostream> 
#include <stdlib.h> 
#include <semaphore.h> 

using namespace std; 

sem_t lobby_people;   //current number of people in the "lobby" 
sem_t rider;    //people on the elevator 
sem_t ele_full;    //tells the elevator it is full 
sem_t arrived;    //tells elevator the person got off, prevents closing the door before they leave 
sem_t sim_done;    //tells main that elevator is done 
sem_t initialized;   //tells main that person has recorded their pid from guest so that it can be safely incremented 
sem_t *exiting_on[11];  //holds persons until they reach their desired floor 
int pushed_button[11] = {0}; //craftily allows elevator to know how many people want to go to a floor 
int current_floor = 1; 
int target_floor =0; 
int e_capacity = 7;   //craftily allows people to know when to tell elevator to close 

//Unimportant printing methods 
// 
// 

void *person(void *pid) 
{ 
    int *person_number = static_cast<int*>(pid); 
    sem_post(&initialized); 
    target_floor = rand() % 9 + 2; 
    sem_wait(&rider); 
    board(*person_number, target_floor); 
    sem_wait(&lobby_people); 
    e_capacity--; 
    pushed_button[target_floor + 1]++; 
    if(e_capacity==0) 
     sem_post(&ele_full); 
    sem_wait(exiting_on[target_floor + 1]); //trying to use the array 
    get_off(*person_number); 
    sem_post(&arrived); 
    pthread_exit(NULL); 
} 

void *elevator(void *arg) 
{ 
    for(int trips = 0; trips < 7; trips++) 
    { 
     sem_wait(&ele_full); 
     close_door(); 
     for(int current_floor = 1; current_floor < 11; current_floor++) 
     { 
      if(pushed_button[current_floor] != 0) 
      { 
       open_door(current_floor + 1); 
       while(pushed_button[current_floor] != 0) 
       { 
        sem_post(exiting_on[current_floor]); //also trying to use the array 
        sem_wait(&arrived); 
       } 
       close_door(); 
      } 
     } 
     open_door(1); 
     e_capacity = 7; 
     for(int new_riders = 0; new_riders < 7; new_riders++) 
      sem_post(&rider); 
    } 
    sem_post(&sim_done); 
    pthread_exit(NULL); 
} 

int main() 
{ 
                 //initializing our semaphores 
    sem_init(&lobby_people, 0, 0); 
    sem_init(&rider, 0, 7); 
    sem_init(&ele_full, 0, 0); 
    sem_init(&arrived, 0, 0); 
    sem_init(&sim_done, 0, 0); 
    sem_init(&initialized, 0, 0); 

    for(int x = 0; x<11; x++)       //the likely culprit! 
     sem_init(exiting_on[x], 0, 0); 

    pthread_t my_thread; 
    pthread_create(&my_thread, NULL, &elevator, NULL); //starts elevator thread, which waits for riders 

    for(int guests = 0; guests < 49; guests++)   //generates 49 people threads 
    { 
     sem_post(&lobby_people); 
     pthread_create(&my_thread, NULL, &person, &guests); 
     sem_wait(&initialized);        //waits for the person to copy their value of guests before incrementing it 
    } 
    sem_wait(&sim_done);        //awaits the end of the elevator's 7th run 
    complete(); 
    return 0; 
} 
+1

あなたがセマフォの配列を宣言しませんでした。あなたはセマフォへのポインタの配列を宣言しました。すべては初期化されておらず、全てランダムなガベージを含んでいます。このような初期化されていないポインタを 'sem_init'に渡すと、未定義の動作を示します。 –

+0

ありがとう、それはまさにそれでした!ポインタと配列のやり取りの仕方と何が混ざっているのだろうか。 – Deusgiggity

答えて

0
sem_t *exiting_on[11]; 

これはsem_tへのポインタの配列を宣言します。配列の値である個体ポインタは初期化されません。ポインタはランダムなジャンクです。

sem_init()は、sem_t構造体への有効なポインタをとり、初期化します。初期化されていない無効なポインタを渡すと、未定義の動作になります。あなたはsem_t構造themsevesの配列を宣言する必要があります

sem_t exiting_on[11]; 

をして、各1を初期化します。

for(int x = 0; x<11; x++) 
    sem_init(&exiting_on[x], 0, 0); 
関連する問題