gpt4 book ai didi

c++ - 跨线程访问类的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 12:13:41 26 4
gpt4 key购买 nike

我对线程和 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 只是整数,在这里只读,不写。我的印象是这意味着它们是线程安全的。写入它们的部分不包括在内,但每个变量仅由一个线程写入,绝不会由两个线程写入。我已尽最大努力不包含我认为不是问题的代码,但如有必要,我可以包含更多代码。在此先感谢您的帮助。

最佳答案

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

你确定你不是在 NULL 实例上调用它吗?

关于这一行:

ThreadSafeQueue* dataQueue = (ThreadSafeQueue*)(pParam);
  1. 您如何确定 pParam 始终为非 NULL?
  2. 您如何确定 pParam 始终是 ThreadSafeQueue 对象?

是否可以删除其他线程上的 ThreadSafeQueue 对象?

关于c++ - 跨线程访问类的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8684508/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com