Cでmalloc()
コールに関する私の考えを少し明確にしたかったのですが、メインスレッドが任意の数のワーカースレッド(pthreads)を生成するマルチスレッドアプリケーションがあります。各ワーカースレッドは無限関数を実行します(含まれている関数は別の.c
ファイルからあり、while(1)を実装しています)。この関数は連続したネットワークI/Oを担当します。複数のスレッドでメモリを割り当てているときにセグメンテーションエラーが発生しました
スレッドごとにハッシュテーブルが必要でしたので、glibが提供するハッシュマップを使用しました。私がしたのは、各スレッドの関数の中でハッシュマップを初期化し、バックエンドで構造体の初期メモリを割り当て、必要に応じてそのハッシュマップを拡張できるということでした。
私はアプリケーションを実行したときに、セグメンテーションフォールトや構造体のメモリを割り当てられないなどのエラーが発生しました。エラーは、ハッシュマップにメモリを割り当てることができなかったことが原因であることがわかりました。私は思っていた(まだ考えている)各スレッドは、独自のメモリ空間を持って、それは独自のメモリブロック内のそれぞれのハッシュマップのメモリのブロックを割り当てます。
lock mutex
initialize hashmap
unlock mutex
各スレッドで呼び出されたハッシュマップを初期化するためのコードは次のとおりです:
私はハッシュマップのような(sudoのコード)の初期化の前と後のmutex
ロックを使用してエラーを修正することができました
GHashTable *g_hash_table;
g_hash_table = g_hash_table_new (g_int_hash, g_int_equal);
問題は解決しましたが、これで少し混乱しました。各スレッドが実装する関数用に独自のメモリ空間を持ち、独自のメモリを割り当てている間に他のスレッドと競合してはいけないので、なぜこの問題が発生するのでしょうか? すべてのガイダンスは高く評価されています。
ありがとうございました。
私は独自のスタックを意味しました。私は独自のスタックを意味していました。スレッド内で初期化される構造は、それぞれのスタックにメモリを割り当てる必要があります。スレッドセーフであるGlibは間違いなく興味深いものです。私はそれについては分かりません。私の概念をクリアするためにいくつかの助けを仰いでください:) – Abdullah
質問にハッシュマップの初期化コードを追加しました。 – Abdullah
これは問題ありませんが、その 'g_hash_table_new'ファクトリ関数を呼び出すため、そこで何が起こっているのかわかりません。 –