分段删除现有对象时出错

时间:2011-08-26 07:44:58

标签: c++ multithreading semaphore

我的代码有一个线程连续处理其他线程排队的对象。排队对象是在函数中使用“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的处理未发布为缩写)

2 个答案:

答案 0 :(得分:1)

在删除

周围添加一些检查
 if ( myQueue[index] != 0 ) {
      delete myQueue[index];
      myQueue[index] = 0;
 } else {
      for diagnosis print large warning here - something is confused 
 }

通过相同的索引捕获双重删除。但是,还有其他几种可能发生崩溃的方法。抓住这些需要采取其他行动。

考虑一下:

  1. 是否存在竞争条件的可能性?两个线程是否可以尝试在同一索引处删除?你需要添加任何同步吗?
  2. 是否可以将同一个对象添加到数组中两次,使用不同的索引?在extremis中,我可能会添加代码以在添加项之前验证该项目是否已存在于数组中。

答案 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是一篇维基百科文章,解释了可能出现的问题。