C++でスレッドプログラムを組んでます
1:メインスレッドで文字をセットするSet関数を処理する
2:スレッドを作成し、1で文字がセットされてらファイル出力する
という処理のプログラムです
文字セットされる度ファイル出力という感じですね
プログラムが出来たのですが
ただ問題が1つありまして
2のスレッドが1に比べ遅く
連続で文字をセットすると、出力されない
場合があります。
回避策としてどういうものがあるでしょうか?
スレッド
Re: スレッド
以下のようにしましたが正しく動作しません
mutexを作成し、同期に使用する
スレッドのでmutexが解放されるまでスレッド待機しています
使い方間違ってますか?
○2のスレッドThreadProc
文字がセットされてたらファイル出力する
この機能を使うかどうかの情報はisModeが所持
while(isMode)
{
WaitForSingleObject(m_mutex,INFINITE);
//文字がセットされたか判断
//されてる場合ファイル出力処理 省略
ReleaseMutex(m_mutex);
}
○1のメインスレッド
WaitForSingleObject(m_mutex,INFINITE);
ReleaceMutex(m_mutex);
//文字セット
mutexを作成し、同期に使用する
スレッドのでmutexが解放されるまでスレッド待機しています
使い方間違ってますか?
○2のスレッドThreadProc
文字がセットされてたらファイル出力する
この機能を使うかどうかの情報はisModeが所持
while(isMode)
{
WaitForSingleObject(m_mutex,INFINITE);
//文字がセットされたか判断
//されてる場合ファイル出力処理 省略
ReleaseMutex(m_mutex);
}
○1のメインスレッド
WaitForSingleObject(m_mutex,INFINITE);
ReleaceMutex(m_mutex);
//文字セット
Re: スレッド
1.のスレッドが値を設定したあと,2.のスレッドが処理する前に1.のスレッドが値を設定しようとした場合に,
どちらにしても,1.のスレッドは「文字を書き込むまで」所有権を放棄してはいけません。
また,2.のスレッドは所有権を取得したなら,ローカル変数等に値をコピーし,できるだけはやく所有権を解放した方が良いです。
- 値を設定可能であるならば,同期オブジェクトはひとつでよい
- アクセスの所有権を処理するためのMutexオブジェクトまたはCriticalSectionオブジェクト
- 値を設定不可能であるならば,同期オブジェクトは2つ必要
- 1.が書き込んだことを示すEventオブジェクト (a)
- 2.が読んだことを示すEventオブジェクト (b)
- a:reset / b:set (初期値) : 1.が所有権を持てる。2.はaがsetされるまで待つ。1.はbをresetして値を書き込み,aをsetする
- a:set / b:reset : 2.が所有権を持てる。1.はbがsetされるまで待つ。2.はaをresetして値を読み出し,bをsetする
- a:reset / b:reset : 1.または2.のどちらかが所有権を持っている
- a:set / b:set : 不正な状態
どちらにしても,1.のスレッドは「文字を書き込むまで」所有権を放棄してはいけません。
また,2.のスレッドは所有権を取得したなら,ローカル変数等に値をコピーし,できるだけはやく所有権を解放した方が良いです。