現在、マルチスレッドを使用するアプリケーションを実装していますが、総メモリ消費量に関する要件があります。I/O を実行するマスター スレッドと、計算を実行する複数のワーカーが必要です。
現在、ワーカーがアクセスするマスタースタックにいくつかのデータ構造があります。仕事の分散にはOpenMPを使っています。マスター/ワーカー パターンは OpenMP ではうまく機能しないため、マルチスレッドに pthread を使用したいと考えています。
各スレッドがローカル スタックを保持していることは知っていますが、スレッドの作成時にスタックに何が起こるのでしょうか?
マスターのスタックにあるデータ構造はワーカーからアクセスできますか、それともヒープに移動する必要がありますか? また、データの重複を避けたいのですが、新しいスレッドがマスター スタックのローカル コピーを作成するかどうかはわかりません。
編集:自分で答えを見つけました...
pthread で使用される clone() システム コールの詳細を読んだ後、すべてのスレッドが完全な仮想メモリを共有していることに気付きました。つまり、スレッドは独自のスタックを使用しますが、各スタックに使用されるメモリ領域は引き続き共有されます。
その動作を確認するためにいくつかのコードを書きました:
#include <stdio.h>
#include <pthread.h>
void* increment(void* value) {
int* val = (int*) value;
for(int i = 0; i < 100; i++) {
++(*val);
}
return 0;
}
int main(int argc, char** argv) {
int stackvar = 0;
pthread_t thread1, thread2;
int iret1, iret2;
iret1 = pthread_create( &thread1, NULL, increment, (void*) &stackvar );
iret2 = pthread_create( &thread2, NULL, increment, (void*) &stackvar );
pthread_join( thread1, NULL );
pthread_join( thread2, NULL );
printf("%i\n", stackvar);
return 0;
}
出力が「200」であるため、スレッドは親スレッドのスタックを正常に操作しました。
インターネット上のほとんどのリソースは、この事実を正しく表現していないと思います。スレッドは共有メモリという意味でスタックを共有しますが、各スレッドのスタックポインタは非公開です。スレッドごとに、共有メモリの一部がローカル スタックとして割り当てられます。
これは、親スレッドがスタック上に大きなデータ構造を持っていても問題にならないことも意味します。これは、メモリがスレッド化のために複製されることがないためです。