は、私は、コードのこの部分を持っている:-O3ループ増分の最適化
#include <iostream>
#include <thread>
long int global_variable;
struct process{
long int loop_times_ = 0;
bool op_;
process(long int loop_times, bool op): loop_times_(loop_times), op_(op){}
void run(){
for(long int i=0; i<loop_times_; i++)
if (op_) global_variable+=1;
else global_variable-=1;
}
};
int main(){
struct process p1(10000000, true);
struct process p2(10000000, false);
std::thread t1(&process::run, p1);
std::thread t2(&process::run, p2);
t1.join();
t2.join();
std::cout <<global_variable<< std::endl;
return 0;
}
主な機能は、インクリメントおよびグローバル変数をデクリメント二つのスレッドを起動します。 これでコンパイルすると:
g++ -std=c++11 -o main main.cpp -lpthread
私は実行ごとに異なる出力を得ます。 しかし、私はこれで-O3を追加してコンパイルした場合:
g++ -O3 -std=c++11 -o main main.cpp -lpthread
出力は私のクリティカルセクションを排除し、ここで何が起こっているの最適化のどのような種類のたびに
ゼロであり、どのようにiは、コンパイラをだますことができますそれを最適化しない?
EDIT:OS:Ubuntuの16.04.4、G ++:5.4.0
これは未定義の動作です。 – NathanOliver
現在のコードの結果は、コンパイル時に計算できます。プログラムの2つの異なる引数として反復回数を渡して、このように実行しようとしましたか? ./a.out 10000000 10000000 – mrks
より速い最適化では、最初のスレッドはもう一方のスレッドが開始する前に終了することもあると思います。時間がかかり、振る舞いが元に戻るまで数を増やしてください。 – Baldrick