Полагаю, у вас есть состояние гонки.Какой механизм синхронизации вы используете для предотвращения изменения index_x
обоими потоками?
Обычно рабочий поток должен вызвать sem_wait, изменить критические данные и затем вызвать sem_post.Я не могу предоставить 100% точный пример кода, не видя, как вы используете index_x, но он будет выглядеть примерно так:
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 делает дурацкие вещи (не может увеличивать или уменьшать, что является самой распространенной дурацкой вещью). Здесь - статья в Википедии, объясняющая, что именно может пойти не так.