問題は次のとおりです。
10 個のスレッドを作成し、それぞれがポインターによってスレッド関数に渡されるトレッド "id" を出力する短いプログラムを作成したいと考えています。
プログラムの完全なコードは次のとおりです。
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
struct params {
pthread_mutex_t mutex;
int id;
};
typedef struct params params_t;
void* hello(void* arg){
int id;
pthread_mutex_lock(&(*(params_t*)(arg)).mutex);
id = (*(params_t*)(arg)).id;
pthread_mutex_unlock(&(*(params_t*)(arg)).mutex);
printf("Hello from %d\n", id);
}
int main() {
pthread_t threads[10];
params_t params;
pthread_mutex_init (¶ms.mutex , NULL);
int i;
for(i = 0; i < 10; i++) {
params.id = i;
if(pthread_create(&threads[i], NULL, hello, ¶ms));
}
for(i = 0; i < 10; i++) {
pthread_join(threads[i], NULL);
}
return 0;
}
想定される出力は次のとおりです (この順序では必要ありません)。
Hello from 0
....
Hello from 9
実際の結果は次のとおりです。
Hello from 2
Hello from 3
Hello from 3
Hello from 4
Hello from 5
Hello from 6
Hello from 8
Hello from 9
Hello from 9
Hello from 9
関数内のさまざまな場所にミューテックスを配置しようとしましたhello()
が、役に立ちませんでした。
スレッド同期を実装するにはどうすればよいですか?
編集:結果は必要ではないと仮定すると、0...9 これらの数字の任意の組み合わせにすることができますが、それぞれが 1 回だけ表示される必要があります。