我的代码有一个线程连续处理其他线程排队的对象。排队对象是在函数中使用“new”创建的,该函数将在处理对象时完成。我没有问题,但删除对象。 我应该不删除对象吗?也许改变传递/创建这个对象的方式?
Object* myQueue[10];
function() {
Object* myobject = new Object();
queueObject(myobject);
}
queueObject(Object* object) {
myQueue[index_x] = object;
sem_post(&mySemaphore);
}
//// Thread 1
function();
...
//// Thread 2
handleObjects() {
while(true) {
sem_wait(&mySemaphore);
// handle myQueue[index_x]
delete myQueue[index_x]; ---> this produces Segmentation Fault
}
}
(index_x的处理未发布为缩写)
答案 0 :(得分:1)
在删除
周围添加一些检查 if ( myQueue[index] != 0 ) {
delete myQueue[index];
myQueue[index] = 0;
} else {
for diagnosis print large warning here - something is confused
}
通过相同的索引捕获双重删除。但是,还有其他几种可能发生崩溃的方法。抓住这些需要采取其他行动。
考虑一下:
答案 1 :(得分:1)
我猜你有竞争条件。您正在使用什么同步机制来阻止两个线程修改index_x
?
通常,工作线程应该调用sem_wait,修改关键数据,然后调用sem_post。如果没有看到你如何使用index_x,我无法提供100%准确的示例代码,但它看起来如下所示:
queueObject(Object* object) {
sem_wait(&mySemaphore);
myQueue[index_x++] = object;
sem_post(&mySemaphore);
}
handleObjects() {
while(true) {
sem_wait(&mySemaphore);
// handle myQueue[index_x]
delete myQueue[--index_x]
sem_post(&mySemaphore);
}
}
目前看起来你没有什么可以阻止index_x被两个线程修改,这可能导致index_x做一些糟糕的事情(无法增加或减少是最常见的事情)。 Here是一篇维基百科文章,解释了可能出现的问题。