🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

1454閲覧

マルチスレッド Afxbeginthreadでの書き込み読み込みに関して

KKKM

総合スコア16

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/09/16 08:57

Afxbeginthreadで作ったスレッド内で
連続的にある変数の値を書き込むとします。

その間に
他スレッドでこのある変数の値を読み込もうとした際に問題は起きますか?

現在のプログラムでは連続的に書き換える変数の値を他スレッドで読み込もうとすると、
書き込み側のスレッドで時折アクセス違反として処理されてしまいます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

こんにちは。

他スレッドでこのある変数の値を読み込もうとした際に問題は起きますか?

連続的に書き込んでいる最中に他スレッドが動作して当該変数の値を読んだ場合、当該変数が書き換えられている途中なので矛盾が発生し、問題が起きることが多いです。

std::mutexstd::lock_guard等を使って保護することがお薦めです。

投稿2019/09/16 09:12

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KKKM

2019/09/16 10:32

ご回答ありがとうございます。 >>問題が起きることが多いです 問題が起きないのはどういったケースでしょうか? 他に何か要因は考えられないでしょうか もしアドバイスございましたらよろしくお願いいたします
yominet

2019/09/16 11:56

他に要因を聞こうとしていますが・・・ あなたのプログラムで発生してる問題に対し、 Chironianさんの回答以外の「問題の要因である可能性の情報」やアドバイスを欲しいのであれば あなたのプログラム固有の情報をもっと書いたほうがいいと思います。
Chironian

2019/09/16 12:01

書き込んでいる最中の中途半端なデータを読み出しても矛盾が発生しないなら問題は起きません。 例えば、要素数と、要素の並びに連続的に書き込んでいたとします。 各要素の間に関連はなく完全に独立しているものと仮定します。 また要素の並びは決まったアドレスを使っていると仮定します。(realloc等で再獲得しないという意味) そして、要素数を増やす時は要素の並びの最後に1つ追加してから、要素数を増やす。 要素数を減らす時は必ず要素の並びの最後から1つ減らす。 これなら恐らく矛盾は発生しません。(とはいえ、深い検証はしていませんので、何か検討漏れがあるかもしれないです。漏れがあると矛盾は発生します。)
majiponi

2019/09/16 14:46

減らすとき、要素数をデクリメントするときにロード→デクリメント→ストアをアトミックにやらないと、他のスレッドがストア前に要素数を参照したときに有効でない要素にアクセスしてしまうのでは?
Chironian

2019/09/16 14:52

あ、その通りです。リード・モデファイ・ライトしてはいけません。 やっぱ真剣に検討しないとダメですね。お恥ずかしい。
asm

2019/09/17 00:31 編集

32bitのCPUで64bit変数を操作した時などに起きうるのですが 変数の読み書きがそもそもアトミックじゃない事もありえます。 (011... → 100... への書き換え中に111...や000...が読み取れるタイミングがある感じ)
fana

2019/09/17 01:42

> 問題が起きないのはどういったケースでしょうか? 値を読む側が単純なbool型フラグをポーリング的にチェックしているような場合とか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問