Segfault доступ к классам через потоки - PullRequest
1 голос
/ 31 декабря 2011

Я немного озадачен проблемой, связанной с многопоточностью и 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 - просто целые числа, и они только читаются здесь, а не пишутся. У меня сложилось впечатление, что это означало, что они были в безопасности. Часть, которая их записывает, не включена, но каждая переменная записывается только одним потоком, а не обоими. Я сделал все возможное, чтобы не включать код, который, по моему мнению, не является проблемой, но я могу включить больше, если это необходимо. Заранее спасибо за любую помощь.

1 Ответ

1 голос
/ 31 декабря 2011

Чаще всего, когда происходит сбой при доступе к нормальной переменной-члену, это означает, что this имеет значение NULL или неверный адрес.

Вы уверены, что не вызываете его для экземпляра NULL?

Относительно этой строки:

ThreadSafeQueue* dataQueue = (ThreadSafeQueue*)(pParam);
  1. Как вы уверены, что pParam всегда не равен NULL?
  2. Как вы уверены, что pParam всегдаa ThreadSafeQueue объект?

Возможно ли удалить объекты ThreadSafeQueue в других потоках?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...