本課程使用lock
和Interlocked
。c#鎖不能按預期工作
increaseCount.with_lock.Run();
和increaseCount.with_interlock.Run();
都在96-100之間打印。
我期待他們兩人始終打印100.我犯了什麼錯誤?
public static class increaseCount {
public static int counter = 0;
public static readonly object myLock = new object();
public static class with_lock {
public static void Run() {
List<Thread> pool = new List<Thread>();
for(int i = 0; i < 100; i++) {
pool.Add(new Thread(f));
}
Parallel.ForEach(pool, x => x.Start());
Console.WriteLine(counter); //should print 100
}
static void f() {
lock(myLock) {
counter++;
}
}
}
public static class with_interlock {
public static void Run() {
List<Thread> pool = new List<Thread>();
for(int i = 0; i < 100; i++) {
pool.Add(new Thread(f));
}
Parallel.ForEach(pool, x => x.Start());
Console.WriteLine(counter);//should print 100
}
static void f() {
Interlocked.Add(ref counter, 1);
}
}
}
你的代碼沒問題。唯一的問題是你的期望。基本上,並不是所有的100個線程都能運行,直到顯示計數器。嘗試在Console.WriteLine(counter)之前放置一個Thread.Sleep(1000),你會明白我的意思。 – 2015-02-07 23:39:56
@everyone謝謝 – 2015-02-07 23:59:55