私はスレッド化と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つのスレッドによってのみ書き込まれ、両方では書き込まれません。問題とは思わないコードを含めないように最善を尽くしましたが、必要に応じてさらに含めることができます。助けを前にありがとう。
"* inCountとoutCountは単なる整数で、ここには書かれていません。*"はい、おそらくそれらはどこかに書かれていて、メモリバリアはありません... – ildjarn
あなたはそれが比較でクラッシュする?両者が整数の場合は、それらを比較するとセグメンテーション違反でアプリケーションがクラッシュするような理由はありません。セグメンテーションフォルトは、プログラムが無効なメモリの読み書きを試みるときに発生します。 'dataQueue-> isFull()'の 'dataQueue'を逆参照しようとする試みが、より可能性の高い犯人のように思えます。 –