Я немного озадачен проблемой, связанной с многопоточностью и C ++. Я пишу плагин DSP для проигрывателя Windows Media и хочу отправить данные, которые я перехватываю, в отдельный поток, куда я отправлю их по сети. Я использую простую очередь производитель-потребитель, как объяснено здесь
Программа аварийно завершает работу функции isFull (), которая сравнивает только два целых числа:
bool ThreadSafeQueue::isFull()
{
if (inCount == outCount) //CRASH!
return true;
else
return false;
}
Поток, который выполняет снятие очереди:
void WMPPlugin::NetworkThread (LPVOID pParam)
{
ThreadSafeQueue* dataQueue = (ThreadSafeQueue*)(pParam);
while (!networkThreadDone)
{
Sleep(2); /// so we don't hog the processor or make a race condition
if (!dataQueue->isFull())
short s = dataQueue->dequeue();
if (networkThreadDone) // variable set in another process so we know to exit
break;
}
}
Конструктор класса, создающего потребительский поток:
WMPPlugin::WMPPlugin()
{
// etc etc
dataQueue = new ThreadSafeQueue();
_beginthread(WMPPlugin::NetworkThread, 0, dataQueue);
}
inCount и outCount - просто целые числа, и они только читаются здесь, а не пишутся. У меня сложилось впечатление, что это означало, что они были в безопасности. Часть, которая их записывает, не включена, но каждая переменная записывается только одним потоком, а не обоими. Я сделал все возможное, чтобы не включать код, который, по моему мнению, не является проблемой, но я могу включить больше, если это необходимо. Заранее спасибо за любую помощь.