我试图创建一个使用多线程的应用程序。每个工作线程都有自己的队列要消耗和处理,而主线程则为它们的队列提供数据。工作线程将根据这些条件动态生成。
为了维护主线程的工作线程信息,每个产生的工作线程都将注册到一个数组中:
struct workerNode **workerMap = (workerNode**) malloc(MAX_WORKER * sizeof(struct workerNode));
而 workerNode 被注入到每个工作线程的结构中:
struct workerNode
{
int offset;
queue<dataRecord*> workerQueue;
short semaphore;
};
问题是,每次我尝试将 a 推dataRecord*
送到工作线程的workerQueue
1 次以上时,都会发生 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;
该应用程序现在看起来很好。谢谢 :)