3

マルチスレッドを使用するアプリケーションを作成しようとしました。すべてのワーカー スレッドには、消費されて処理される独自のキューがあり、メイン スレッドはそれらのキューにフィードします。ワーカー スレッドは、そのような条件に従って動的に生成されます。

メイン スレッドのワーカー スレッドの情報を維持するために、生成された各ワーカー スレッドは配列に登録されます。

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;

そして、アプリケーションは今では問題ないようです。ありがとう :)

4

0 に答える 0