スレッド

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Cユーザー

スレッド

#1

投稿記事 by Cユーザー » 7年前

C++でスレッドプログラムを組んでます

1:メインスレッドで文字をセットするSet関数を処理する
2:スレッドを作成し、1で文字がセットされてらファイル出力する

という処理のプログラムです
文字セットされる度ファイル出力という感じですね

プログラムが出来たのですが
ただ問題が1つありまして
2のスレッドが1に比べ遅く
連続で文字をセットすると、出力されない
場合があります。

回避策としてどういうものがあるでしょうか?

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: スレッド

#2

投稿記事 by YuO » 7年前

ちゃんと同期をとってやればよいでしょう。
1.は2.が読むまでセットしなければ良いのですから。

ホヅミ
記事: 110
登録日時: 9年前

Re: スレッド

#3

投稿記事 by ホヅミ » 7年前

現在の処理は下のような図になっていて同期が取れていない状態です
スレッド.png
スレッド.png (3.78 KiB) 閲覧数: 677 回
なのでYuOさんの言うとおり同期をとらせる必要があります
イメージとしては下の図のような感じで
スレッド2.png
スレッド2.png (2.63 KiB) 閲覧数: 677 回
二つのスレッドが同時に回ってなきゃいけないということもありませんし、スレッドプログラムを組まなければ処理ができないということもございません。
(今回はスレッドを作ってね☆みたいな感じに言われてるかもしれませんが)

Cユーザー

Re: スレッド

#4

投稿記事 by Cユーザー » 7年前

以下のようにしましたが正しく動作しません
mutexを作成し、同期に使用する
スレッドのでmutexが解放されるまでスレッド待機しています
使い方間違ってますか?

○2のスレッドThreadProc
文字がセットされてたらファイル出力する
この機能を使うかどうかの情報はisModeが所持

while(isMode)

WaitForSingleObject(m_mutex,INFINITE);
//文字がセットされたか判断
//されてる場合ファイル出力処理 省略
ReleaseMutex(m_mutex);


○1のメインスレッド
WaitForSingleObject(m_mutex,INFINITE);
ReleaceMutex(m_mutex);

//文字セット

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: スレッド

#5

投稿記事 by YuO » 7年前

1.のスレッドが値を設定したあと,2.のスレッドが処理する前に1.のスレッドが値を設定しようとした場合に,
  • 値を設定可能であるならば,同期オブジェクトはひとつでよい
    • アクセスの所有権を処理するためのMutexオブジェクトまたはCriticalSectionオブジェクト
  • 値を設定不可能であるならば,同期オブジェクトは2つ必要
    • 1.が書き込んだことを示すEventオブジェクト (a)
    • 2.が読んだことを示すEventオブジェクト (b)
    a/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.のスレッドは所有権を取得したなら,ローカル変数等に値をコピーし,できるだけはやく所有権を解放した方が良いです。

Cユーザー

Re: スレッド

#6

投稿記事 by Cユーザー » 7年前

ありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る