2017-12-21 28 views
1

構造体に格納されているカウンタの値をインクリメントしたい。 3つのスレッドが人々の数を増やすためにtattoo_shopというフォントに入っていますが、何らかの理由でnumber_of_peopleの値は同じままです。Cで複数のスレッドを持つ構造体の値を増やす方法

ケースを順番に再生しようとしましたが、動作しています。私はスレッドで作業しているので、何か特別なことはありますか?

typedef struct { 
    int number_of_people; 
}Queue; 

void *tattoo_shop(void *arguments){ 
    Client *args = arguments; 
    Queue the_queue; 

    add_to_the_queue(&the_queue,args); 
} 

void add_to_the_queue(Queue *the_queue, Client *the_client) { 

    pthread_mutex_lock(&mutex_queue); 
    the_queue->number_of_people++; 
    pthread_mutex_unlock(&mutex_queue); 

    printf("The thread %d is changing the counter of the queue which is now %d \n",the_client->id,the_queue->number_of_people); 
} 

:)ありがとう出力:

The thread 1 is changing the counter of the queue which is now 1 
The thread 0 is changing the counter of the queue which is now 1 
The thread 2 is changing the counter of the queue which is now 1 
+1

the_queueはローカル変数であり、あなたがルーチンを呼び出すたびに、それはあなたの複数のスレッドが同じキューを共有して終わるか私にははっきりしていない – Ora

+0

改めてintializedています。 –

+0

@OliverCharlesworth私のスレッドはすべてtattoo_shopという関数に行き、そこから関数add_to_the_queueに入ります。 – MaxUt

答えて

2

あなたのコードQueue the_queue;がローカル変数ではなく、共有の一つですので、ナンセンスです。

しかし、それはファイルのスコープで割り当てられていたか、staticとして割り当てられていましたが、コードは大体正常です。他の場所からのオブジェクトへの書き込みはアトミックであることが保証されていないため、防御的には、ミューテックスガード外の共有オブジェクトを読み取るべきではありません。この問題を解決するために微調整:

{ 
    pthread_mutex_lock(&mutex_queue); 
    int people = the_queue->number_of_people++; 
    pthread_mutex_unlock(&mutex_queue); 

    printf("%d", people); 
} 
+0

the_queueをどのように共有できますか?つまり、tattoo_shopでテストを実行するには、このデータを関数add_to_the_queueから取得する必要があります。 – MaxUt

+0

@MaxUt:関数(ファイル静的変数)の外にあるキューを定義します。これもゼロに初期化されます。あなたのコードは初期化されていない変数をインクリメントします。メモリがゼロになるのは幸運なことです(前のプロセスが同じ物理メモリに格納されているデータを詮索するのを防ぐためですが、そして、キューへのアクセスはすべて、ミューテックスによって仲介される必要があります(これは、コードでは宣言されていませんが、ファイルスコープ変数でなければなりません)。あなたの印刷コードは、ミューテックスのロック/ロック解除のペアの範囲内になければなりません。 –

関連する問題