2011-12-30 10 views
1

私はスレッド化とC++で問題を抱えています。私はWindows Media Player用のDSPプラグインを作成しています。インターセプトしたデータを別のスレッドに送信して、ネットワーク上で送信します。スレッド間でクラスにアクセスするSegfault

bool ThreadSafeQueue::isFull() 
{ 
    if (inCount == outCount) //CRASH! 
     return true; 
    else 
     return false; 
} 

デキューをやっているのスレッド::

1は、プログラムがちょうど2つの整数を比較し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つのスレッドによってのみ書き込まれ、両方では書き込まれません。問題とは思わないコードを含めないように最善を尽くしましたが、必要に応じてさらに含めることができます。助けを前にありがとう。

+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行とその後のデキュー行を取り除くと、私のプログラムは正常に動作します – Nate

関連する問題