私はmutexを研究しています。ここでスレッド同期を使用することはできますか?
この例は、同期なしで動作するように見えます。
#include <cstdint>
#include <thread>
#include <iostream>
constexpr size_t COUNT = 10000000;
int g_x = 0;
void p1(){
for(size_t i = 0; i < COUNT; ++i){
++g_x;
}
}
void p2(){
int a = 0;
for(size_t i = 0; i < COUNT; ++i){
if (a > g_x){
std::cout << "Problem detected" << '\n';
}
a = g_x;
}
}
int main(){
std::thread t1{ p1 };
std::thread t2{ p2 };
t1.join();
t2.join();
std::cout << g_x << '\n';
}
私の仮定は以下のとおりである。g_x
の値
スレッド1つの変化を、それが値を変更するだけのスレッドなので、理論的にはこれがOKであることを仮定します。
スレッド2は、g_x
の値を読み取ります。読み込みは、x86とARMではアトミックであると仮定します。だからそこにも問題はないはずです。私はいくつかの読み取りスレッドの例があり、それもOKを動作します。
つまり、書き込みは共有されず、読み取りはアトミックです。
仮定は正しいですか?
't1'は' a> g_x1'( 't1'の' g_x1'の 'g_x1'の値)になります。 'a == g_x0' - ある時点で' t0'( 't0 <= t1')' a'が 'g_x'から割り当てられます。 't0 <= t1'と' g_x0> g_x1'となります。別の側からは 'g_x'だけインクリメントします - したがって' t0 <= t1' => 'g_x0 <= g_x1' - 矛盾です。その結果、 'a> g_x'は決して起こらないと言うことができます。ここで何を試してみるのですか?この種のコードでは(あるスレッドがint変数をインクリメントするとき)、別のスレッドはランダムなタイミングでこのintを読み込みます。同期は必要ありません。しかし何? – RbMm
'if(a> g_x){'これは 'g_x'だけが増加することを示す一種のテストです。別のテストをお勧めしますか? – Nick
何のテスト?あなたは何を証明しようとしますか?しかし、もし私が間違っていないなら、あなたの "テスト"(a <= g_x)で、常に設計されています。ここで同期に関係していない – RbMm