저는 스레딩 및 C++에서 발생하는 문제에 조금 놀랐습니다. 저는 Windows Media Player 용 DSP 플러그인을 작성하고 있으며, 인터셉트 한 데이터를 네트워크에서 전송할 별도의 스레드로 보내려고합니다. 큐 해제를하고있어Segfault가 스레드간에 클래스에 액세스하는 중
bool ThreadSafeQueue::isFull()
{
if (inCount == outCount) //CRASH!
return true;
else
return false;
}
스레드 :
나는 것과 같은 단순한 생산자 - 소비자 대기열이 프로그램은() 함수는 두 정수를 비교되는 isFull에 충돌되어 here설명 사용하고 있습니다
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는 정수이며 여기에 쓰여지며 쓰여지지 않습니다. 나는 이것이 쓰레드에 안전하다는 인상을 받고 있었다. 그것들을 쓰는 부분은 포함되지 않지만, 각 변수는 오직 하나의 쓰레드에 의해서만 쓰여지며, 둘 다 쓰이지 않습니다. 나는 내가별로 느끼지 않는 코드를 포함시키지 않기 위해 최선을 다했지만, 필요한 경우 더 많이 포함 할 수 있습니다. 모든 도움을 미리 감사드립니다.
"* inCount 및 outCount는 정수이며 여기에 쓰여지며 쓰여지지 않습니다. *"예, 아마도 다른 곳에 쓰여졌을 것이며 메모리 장벽이없는 것 같습니다 ... – ildjarn
확실한 점은 확실합니까? 비교 충돌? 둘 다 정수인 경우 세그멘테이션 오류를 비교하여 응용 프로그램을 중단해야하는 이유가 없습니다. 세그먼트 화 오류는 프로그램이 유효하지 않은 메모리에서 읽거나 쓰려고 할 때 발생합니다. 'dataQueue-> isFull()'에서'dataQueue'를 역 참조하려고 시도하는 것이 범인 인 것처럼 보입니다. –