他の発言に加えて、
pthread_create(&thr[i], 0, makeRequest, &i);
i
はローカル変数であるため、正しくありません。pthread_create&i
へのすべての呼び出しで同じポインタが使用されます。
通常、データポインタをスレッドルーチンに作成する必要があります。ここで、スレッドルーチンはmakeRequest
静的ポインタまたは一意のポインタ(スレッドごとに一意)のいずれかです。実際には、それをいくつかのmalloc
-edメモリへのポインタにします。
より良い方法は、いくつかを宣言してstruct my_thread_data_st
、それをヒープに一意に割り当てることです。
struct my_thread_data_st* td = malloc(sizeof(struct my_thread_data_st));
if (!td) perror("malloc td"), exit(EXIT_FAILURE);
memset (td, 0, sizeof(struct my_thread_data_st));
// fill td appropriately, then
pthread_create(&thr[i], 0, makeRequest, td);
int
または、たとえば-sの配列を使用することもできます。たとえばint num[4];
、適切に初期化してから、pthread_create(&thr[i], 0, makeRequest, &num[i]);
もちろん、td
がヒープに割り当てられている場合は、適切なタイミングで、たとえばスレッドが終了した後(たとえば、pthread_joinmalloc
を実行した後)に忘れないでください。また、 BoehmのGCに興味があり、代わりに使用することもできます(その後、メモリを解放することを気にしないでください。GCがそれを実行します)。free
GC_malloc
malloc
スレッドが共有データにアクセスしている場合は、[グローバルまたは静的]ミューテックスを使用してアクセスをシリアル化する必要があります(pthread_mutex_lock
&を使用pthread_mutex_unlock
)
pthread_join
終了する前に、すべてのスレッドを呼び出すことを忘れないでください。たとえば、から戻るなどですmain
。
いくつかのpthreadチュートリアルと高度なLinuxプログラミングに関する本を読むことをお勧めします。