私はQt/C++プログラマです。今日私は糸の安全性に取り組んでおり、これについて数多くの議論がありました。共有されている読み取り/書き込み変数の中に割り込みスレッド C/C++でオブジェクトを作成する際のコンパイラの最適化の境界は何ですか?
- 原子性:それから私は4つのタイトルで安全性の問題をリストアップしました私は二句を除くこれらのすべてを理解している
スレッド間で共有される変数の同時読み取り/書き込みのスレッド間
int i=0;
void foo()
{
for (;i<100;i++)
{}
{
いくつかのリソースによると、上記のコードで、コンパイラが完成数えるまで、CPUのメモリからレジスタにi
を移動する、その最終的な値でそれを書き戻します。したがって、上記のコードがカウントされている間に別のスレッドがi
の値を読み取ろうとするとどうなりますか。カウントが終了するまでゼロになります。カウントが終了するまで、実際の価値は依然としてCPU上にあるからです。したがって予期しないステータスが発生します。それはmain()
機能に初期化されているため、Qtのドキュメント、メインスレッドが所有thread
オブジェクトのメンバ変数に応じて、上記のコードで
class MyThread : public QThread
{
Q_OBJECT
void run()
{
mutex.lock();
status=true;
mutex.unlock();
}
private:
QMutex mutex;
bool status;
};
int main()
{
MyThread thread;
thread.start();
return 0;
}
、およびrun()
関数のコードは、第二上で実行されていますのは、多くの他の例を見てみましょう糸。そして、私はmutex
オブジェクトをアクセスとアトミック性のシリアライゼーションに使用しました。しかし、どのように私はそれを知ることができる、コンパイラは実際にmutex
オブジェクトをメモリに初期化した後、2番目のスレッドはrun()
関数でそれを使用しました。コンパイラはシーケンシャルコードフローで実際にmutex
オブジェクトの使用を見たことがないので、メモリにロードできない可能性があります。例えば、コンパイル時に、コンパイラは、追加メモリを獲得するためにシーケンシャルコードフローで使用されないいくつかの変数を削除したり、いくつかのメモリオーダ操作後にすべてのメンバ値をメモリに書き込むことがあります。どうすればそれを知ることができますか?コンパイラが変数を最適化したかどうかをどのように知ることができます
すべてのスレッドには独自のスタックがあることに注意してください。各スレッドはあなたのforループを独立して実行します。 –
この質問の編集は、最初の部分を完全に変更しました。時間を費やした人は、時間を無駄にしていました。これはあまり準備ができておらず、文句のつかない質問です。 –
申し訳ありませんが、私はあなたの時間を無駄にしましたが、もっと説明したかったのです。 –