2011-12-30 5 views
1

저는 스레딩 및 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는 정수이며 여기에 쓰여지며 쓰여지지 않습니다. 나는 이것이 쓰레드에 안전하다는 인상을 받고 있었다. 그것들을 쓰는 부분은 포함되지 않지만, 각 변수는 오직 하나의 쓰레드에 의해서만 쓰여지며, 둘 다 쓰이지 않습니다. 나는 내가별로 느끼지 않는 코드를 포함시키지 않기 위해 최선을 다했지만, 필요한 경우 더 많이 포함 할 수 있습니다. 모든 도움을 미리 감사드립니다.

+1

"* inCount 및 outCount는 정수이며 여기에 쓰여지며 쓰여지지 않습니다. *"예, 아마도 다른 곳에 쓰여졌을 것이며 메모리 장벽이없는 것 같습니다 ... – ildjarn

+1

확실한 점은 확실합니까? 비교 충돌? 둘 다 정수인 경우 세그멘테이션 오류를 비교하여 응용 프로그램을 중단해야하는 이유가 없습니다. 세그먼트 화 오류는 프로그램이 유효하지 않은 메모리에서 읽거나 쓰려고 할 때 발생합니다. 'dataQueue-> isFull()'에서'dataQueue'를 역 참조하려고 시도하는 것이 범인 인 것처럼 보입니다. –

답변

1

일반적으로 일반 멤버 변수에 액세스하는 데 크래시가 발생하면 this이 NULL이거나 잘못된 주소임을 나타냅니다.

NULL 인스턴스에서 호출하지 않습니까?

ThreadSafeQueue* dataQueue = (ThreadSafeQueue*)(pParam); 
  1. 당신이 pParam 항상 NULL이 아닌 것을 어떻게 확신 :

    이 라인에 대해서?

  2. pParam은 항상 ThreadSafeQueue 개체입니까?

다른 스레드에서 ThreadSafeQueue 개체를 삭제할 수 있습니까?

+0

_beginthread에서 나는 dataQueue를 인수로 전달합니다. 이는 pParam이 유효 함을 의미합니다. 또한 isFull 줄과 dequeue 줄을 꺼내면 내 프로그램이 잘 실행됩니다. – Nate

관련 문제