マルチスレッドを使用するアプリケーションを作成しようとしました。すべてのワーカー スレッドには、消費されて処理される独自のキューがあり、メイン スレッドはそれらのキューにフィードします。ワーカー スレッドは、そのような条件に従って動的に生成されます。
メイン スレッドのワーカー スレッドの情報を維持するために、生成された各ワーカー スレッドは配列に登録されます。
struct workerNode **workerMap = (workerNode**) malloc(MAX_WORKER * sizeof(struct workerNode));
一方、workerNode は各ワーカー スレッドに注入された構造体です。
struct workerNode
{
int offset;
queue<dataRecord*> workerQueue;
short semaphore;
};
dataRecord*
問題は、ワーカー スレッドのにをプッシュしようとするworkerQueue
たびに、SEGFAULT が 1 回以上発生することです。最初のプッシュは問題なく成功しますが、2 回目は完全に失敗します。
これは gdb バックトレースです。
Program received signal SIGSEGV, Segmentation fault.
0x0000000000402382 in __gnu_cxx::new_allocator<int>::construct(int*, int const&) ()
(gdb) bt
#0 0x0000000000402382 in __gnu_cxx::new_allocator<int>::construct(int*, int const&) ()
#1 0x0000000000401e40 in std::deque<int, std::allocator<int> >::push_back(int const&) ()
#2 0x0000000000401a83 in std::queue<int, std::deque<int, std::allocator<int> > >::push(int const&) ()
#3 0x0000000000401361 in listenerProcess(int, char*) ()
#4 0x0000000000401854 in main ()
これは、キューへのプッシュを呼び出す方法です。
while(workerMap[index] != 0)
{
workerMap[index]->workerQueue.push(rec);
index++;
}
誰でも私を助けることができますか?ありがとう
編集:
WhozCraig が以前に示唆したように、私は別の実験を行いました。
struct workerNode **workerMap = (workerNode**) malloc(MAX_WORKER * sizeof(workerNode*)); // storing pointers, not objects
私はまだ同じ方法を使用してworkerMap
. workerNode
でも地図への登録方法を変えました。
//workerMap[index] = (struct workerNode*) malloc(sizeof(struct workerNode));
workerMap[index] = new struct workerNode;
そして、アプリケーションは今では問題ないようです。ありがとう :)