複数スレッド間で参照される構造体変数に関して、以下の通り処理した時、
「3.」では必ず「1.」で書き換えた時の値となり、順序性は保証されているのでしょうか。
「1.」の実行後にはThread.MemoryBarrierまたはlock構文により同期が必要でしょうか。
1.スレッドA 構造体変数書き換え
2.スレッドA Control.InvokeによりスレッドBへ処理委譲
3.スレッドB 構造体変数読み込み
読み込む前に別のスレッドで書き換えることは可能ですね。だけど Invoke を使っている間は元スレッドが停止するので処理がこれだけなら問題ありません。
もちろん 3 が Invoke 終了後なら同期してないので問題ありです。
「3.」は「2.」でInvokeした処理です
現在、同期処理に関する問題に遭遇しており、
色々調べたところ、ちょっと信じられない現象ですが、
Control.InvokeがControl.BeginInvokeの様に、
非同期実行されていることがわかりました。
一度アプリがこの状態になると常に非同期実行されます。
なおVS上でデバッグ実行してると発生せずに、アプリを直接実行した場合にだけ起こります。
現象発生後にVSでアタッチしステップ実行することで把握しました。
本現象に関して知見のある方いらっしゃいませんでしょうか。
.NET Frameworkのバージョンは4.0です。実行マシンはWindows10 64bit 1809です。
.NET Frameworkのバージョンが古い為、バージョンを上げて再現確認等しております。
問題の再現する最小のコードを新規で作り、回答者の環境で問題の確認ができるようにしてください。
コードは質問を編集し、マークダウンを使って掲載してください。
アプリ再起動時にアプリが上手く起動できずその後はControl.InvokeがControl.BeginInvokeの様に動作するようです。問題となるロジック部分を抜き出した最小のコードとすると現象が出なくなってしまいました。最小までいかないくらいのコード量だと、稀に発生します。もう少し状況整理をした上で、改めて投稿させて頂きたく思います。
回答1件
あなたの回答
tips
プレビュー