Segfault跨线程访问类

时间:2011-12-30 22:05:45

标签: c++ windows multithreading

我对使用线程和C ++的问题感到有些困惑。我正在为Windows Media Player编写一个DSP插件,我想将我拦截的数据发送到一个单独的线程,我将把它发送到网络上。我正在使用一个简单的生产者 - 消费者队列,如解释here

的队列

程序在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 个答案:

答案 0 :(得分:1)

大多数情况下,当访问正常成员变量时发生崩溃,这意味着this为NULL或地址无效。

您确定没有在NULL实例上调用它吗?

关于这一行:

ThreadSafeQueue* dataQueue = (ThreadSafeQueue*)(pParam);
  1. 您对pParam始终是非NULL的确定吗?
  2. 您对pParam始终是ThreadSafeQueue对象有多确定?
  3. 您是否可以删除其他线程上的ThreadSafeQueue个对象?