3

我试图创建一个使用多线程的应用程序。每个工作线程都有自己的队列要消耗和处理,而主线程则为它们的队列提供数据。工作线程将根据这些条件动态生成。

为了维护主线程的工作线程信息,每个产生的工作线程都将注册到一个数组中:

struct workerNode **workerMap = (workerNode**) malloc(MAX_WORKER * sizeof(struct workerNode));

而 workerNode 被注入到每个工作线程的结构中:

struct workerNode
{
    int offset;
    queue<dataRecord*> workerQueue;
    short semaphore;
};

问题是,每次我尝试将 a 推dataRecord*送到工作线程的workerQueue1 次以上时,都会发生 SEGFAULT。第一次推动是成功,没问题,但第二次是完全失败。

这是 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