我对使用线程和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只是整数,它们只在这里阅读,而不是写入。我的印象是这意味着他们是线程安全的。写入它们的部分不包括在内,但每个变量只由一个线程写入,而不是由两个线程写入。我尽力不包括我认为不是问题的代码,但如果有必要,我可以包含更多代码。提前感谢您的帮助。
答案 0 :(得分:1)
大多数情况下,当访问正常成员变量时发生崩溃,这意味着this
为NULL或地址无效。
您确定没有在NULL实例上调用它吗?
关于这一行:
ThreadSafeQueue* dataQueue = (ThreadSafeQueue*)(pParam);
pParam
始终是非NULL的确定吗?pParam
始终是ThreadSafeQueue
对象有多确定?您是否可以删除其他线程上的ThreadSafeQueue
个对象?