C++ で競合状態をエミュレートしようとしています。以下は私のコードで、IDEとしてxcodeを使用しています
関連するコードは次のようになります。
int main(int argc, const char * argv[])
{
int value=0;
int* ptr = &value;
racer r1(ptr, "John");
racer r2(ptr, "Mike");
std::thread my_thread1(r1);
std::thread my_thread2(r2);
//guard g1(my_thread1);
//guard g2(my_thread2);
my_thread1.join();
my_thread2.join();
cout<<"result:= "<<*ptr<<endl;
cout <<"end!"<<endl;
return 0;
}
そして、私が持っているレーサーのために:
racer::racer(int* r, char const* name)
{
this->r=r;
this->name=name;
}
void racer::print_result()
{
cout<<this->name<<" "<<*r<<endl;
}
void racer::count_now()
{
for ( int i = 0; i < 50; i++ )
{
*r = *r + 1;
cout<<this->name<<". "<<*r<<endl;
}
}
void racer::operator()()
{
count_now();
}
したがって、基本的に、競合なしで期待される結果は *ptr = 100 です。これは、同じリソースで一緒に実行される 2 つのスレッドがあるためです。そのため、実行すると100になることもあれば、クラッシュして以下のエラーメッセージが表示されることもあります。何故ですか?つまり、100 を超える値を取得できないのはなぜですか? クラッシュした場合、競合状態が発生してエラーが発生したことを意味しますか?