2012-04-21 3 views
1

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); 

問題は解決しましたが、これで少し混乱しました。各スレッドが実装する関数用に独自のメモリ空間を持ち、独自のメモリを割り当てている間に他のスレッドと競合してはいけないので、なぜこの問題が発生するのでしょうか? すべてのガイダンスは高く評価されています。

ありがとうございました。

答えて

2

各スレッドは独自のメモリ空間を持ちません。すべてのスレッドは、プロセス内のすべてのスレッドのメモリにアクセスできます。

つまり、各スレッドはこのスペース内に独自のスタックが割り当てられているため、誤って使用されていないとauto-varsは正常であり、malloc/freeはスレッドセーフである必要があるため、動的に割り当てられたハッシュマップスレッドスタック上の自動ポインタ)は正常でなければなりません。

選択肢がある場合は、ライブラリのスレッドセーフバージョンとリンクしていることを確認してください。

mutexロックは必要ありません。それが問題を解決していれば、そうだね、malloc/freeの何かは、スレッドセーフではありません。

ハッシュマップコードは自動ストレージまたはmallocedストレージのみを参照していることを確認してください。グローバル/静的変数が氾濫していないか?

+0

私は独自のスタックを意味しました。私は独自のスタックを意味していました。スレッド内で初期化される構造は、それぞれのスタックにメモリを割り当てる必要があります。スレッドセーフであるGlibは間違いなく興味深いものです。私はそれについては分かりません。私の概念をクリアするためにいくつかの助けを仰いでください:) – Abdullah

+0

質問にハッシュマップの初期化コードを追加しました。 – Abdullah

+0

これは問題ありませんが、その 'g_hash_table_new'ファクトリ関数を呼び出すため、そこで何が起こっているのかわかりません。 –

関連する問題