2017-05-11 5 views
0

私の現在のコードはプロデューサのコンシューマの質問に答えていますが、別の方法で実装したいと思います。私はグローバル変数を使用してバッファスタックのカウントを追跡したくありません。私の思考プロセスは何ですか?グローバル変数を持たないスレッドでセマフォを実装する方法

typedef int semaphore; 
semaphore mutex, full, empty; 

int count = 0; 

    union semun { 
     int val; 
     struct semid_ds *buf; 
     unsigned short  *array; 
    } arg; 


int buffer[N]; 

これらは、カウント

int remove_item() 
{ 
    int ret = buffer[--count]; 
    buffer[count] = 0; 
    return ret; 
} 

void insert_item(int item) 
{ 
    buffer[count++] = item; 
} 

int produce_item(){ 
    int item = rand()%50 +1; 
    printf("Producer produces %d\n",item); 
    sleep(1); 
    return item; 
} 

そして、私の生産者、消費者の機能

void* consumer(void * arg) { 
    int item = 0; 
    while(1){ 
     down(full); 
     down(mutex);  
     item = remove_item(); 
     buffer[count++] = item; 
     up(mutex); 
     up(empty); 
     consume_item(item); 
    } 
    return 0; 
} 

void* producer(void* arg) { 
    int item, i =0; 
    while(1){ 
     item = produce_item(); 
     down(empty); 
     down(mutex); 
     insert_item(item); 
     up(mutex); 
     up(full); 
     sleep(1); 

    } 
+0

カウント、3つのセマフォ、およびバッファ領域は、すべて1つの 'PCqueue'構造体に属します。初期化されたもの(またはそのポインタ)を返す関数が必要です。構造体は、任意のスレッドのスタック上に簡単に持ち上げることができます。 – ThingyWotsit

+0

投稿されたコードはどのセマフォも実装していません。結果として生じる「レース」条件は、壊れた、紛失した、重複したデータをもたらす。 – user3629249

答えて

1

を使用する機能であり、通常の方法では、パラメータとしてスレッドによって使用される変数を渡すことです。ほとんどのスレッドライブラリ(POSIX pthread、Windows CreateThreadなど)は、作成時にスレッドに渡すデータの任意のフォームへのvoidポインタを許可することでこれをサポートしています。これがスレッドコールバック関数の "arg"パラメータです。

関連する問題