5. public class A {
int c = 0;
public void Add() {
c += 1;
}
}
この関数Addはスレッドセーフか?
6. public class A {
int c = 0;
public void Add() {
c += 1;
}
}
答え
この関数Addはスレッドセーフではない
7. public class A {
int c = 0;
public void Add() {
c += 1;
}
}
var a = new A();
a.Add();
var a = new A();
a.Add();
スレッドA
スレッドB
複数のスレッドで実行すると・・・
8. public class A {
int c = 0;
public void Add() {
c += 1;
}
}
var a = new A();
a.Add();
var a = new A();
a.Add();
スレッドA
スレッドB
複数のスレッドで実行すると・・・
問題なし!あれ?
9. public class A {
int c = 0;
public void Add() {
c += 1;
}
}
a.Add();
スレッドA
スレッドB
複数のスレッドでオブジェクトを共有すると
アウト!
var a = new A();
a.Add();
10. public class A {
int c = 0;
public void Add() {
c += 1;
}
}
変数cがスレッド間で共有されていると
アウト!
11. 0
public class A {
int c = 0;
public void Add() {
c += 1;
}
}
メモリ
40. public class A {
int c = 0;
public void Add() {
int d = c;
do {
int e = Interlocked.CompareExchange(ref c, d+1, d);
if (e == d) return;
else d = e;
} while (true);
}
}
41. 0
0 1
int e = Interlocked.CompareExchange(ref c, d+1, d);
54. public class A {
int c = 0;
public void Add() {
int d = c;
do {
int e = Interlocked.CompareExchange(ref c, d+1, d);
if (e == d) return;
else d = e;
} while (true);
}
}