質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

並列処理

複数の計算が同時に実行される手法

Q&A

解決済

1回答

451閲覧

Control.InvokeメソッドはThread.MemoryBarrier相当動作により、順序性を保証するか

naitou

総合スコア141

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

並列処理

複数の計算が同時に実行される手法

0グッド

0クリップ

投稿2020/01/10 03:57

複数スレッド間で参照される構造体変数に関して、以下の通り処理した時、
「3.」では必ず「1.」で書き換えた時の値となり、順序性は保証されているのでしょうか。

「1.」の実行後にはThread.MemoryBarrierまたはlock構文により同期が必要でしょうか。

1.スレッドA 構造体変数書き換え
2.スレッドA Control.InvokeによりスレッドBへ処理委譲
3.スレッドB 構造体変数読み込み

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

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

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

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

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

Zuishin

2020/01/10 04:05

読み込む前に別のスレッドで書き換えることは可能ですね。だけど Invoke を使っている間は元スレッドが停止するので処理がこれだけなら問題ありません。
Zuishin

2020/01/10 04:11

もちろん 3 が Invoke 終了後なら同期してないので問題ありです。
naitou

2020/01/10 08:47

「3.」は「2.」でInvokeした処理です
naitou

2020/01/10 08:50

現在、同期処理に関する問題に遭遇しており、 色々調べたところ、ちょっと信じられない現象ですが、 Control.InvokeがControl.BeginInvokeの様に、 非同期実行されていることがわかりました。 一度アプリがこの状態になると常に非同期実行されます。 なおVS上でデバッグ実行してると発生せずに、アプリを直接実行した場合にだけ起こります。 現象発生後にVSでアタッチしステップ実行することで把握しました。 本現象に関して知見のある方いらっしゃいませんでしょうか。 .NET Frameworkのバージョンは4.0です。実行マシンはWindows10 64bit 1809です。 .NET Frameworkのバージョンが古い為、バージョンを上げて再現確認等しております。
Zuishin

2020/01/10 09:06

問題の再現する最小のコードを新規で作り、回答者の環境で問題の確認ができるようにしてください。 コードは質問を編集し、マークダウンを使って掲載してください。
naitou

2020/01/10 15:48

アプリ再起動時にアプリが上手く起動できずその後はControl.InvokeがControl.BeginInvokeの様に動作するようです。問題となるロジック部分を抜き出した最小のコードとすると現象が出なくなってしまいました。最小までいかないくらいのコード量だと、稀に発生します。もう少し状況整理をした上で、改めて投稿させて頂きたく思います。
guest

回答1

0

ベストアンサー

memory barrier が必要とは思いますが、データ変更に interlock を使う手もあります。

投稿2020/01/16 07:21

mmaeda

総合スコア269

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問