我正在看看在http://www.albahari.com/threading/part4.aspx 中描述的內存障礙部分,並試圖做一個異步/ await版本的例子'我們真的需要鎖和障礙?': 線程安全異步/等待與內存緩存
public class Program
{
static void Main(string[] args)
{
TestAsync();
Console.ReadKey(true);
}
private static async void TestAsync()
{
bool complete = false;
Func<Task> testFunc = async() =>
{
await Task.Delay(1000);
bool toggle = false;
while (!complete) toggle = !toggle;
};
var task = testFunc();
Thread.Sleep(2000);
complete = true;
await task;
Console.WriteLine("Done");
}
}
當沒有調試下發行模式中運行,程序將永遠不會完成按照原來的線程例如,它是基於關閉。
但是,由於上下文被保存的方式,我受到了異步/等待的印象,它會阻止這些類型的問題。或者在使用異步/等待時所有線程安全規則仍然適用?
雖然這將確實解決問題,[Eric Lippert本人不鼓勵使用易失性](https://blogs.msdn.microsoft.com/ericlippert/2011/06/16/atomicity-volatility-and-immutability-是不同的 - 第三/) – Rob
好吧,像Eric Lippert在總結中所熟悉的那樣,他肯定比任何事情都更加咆哮,並用它來強制一個肯定是錯誤的觀點。在C#中,布爾(布爾)字段是原子的,這意味着它總是線程安全的。絕對沒有理由對布爾進行鎖定,因爲這會導致性能下降。不要相信我,請嘗試測試它,因爲我有。看到布爾是原子的,並且總是線程安全的,我們可以將它用於多線程的事情。然而;以防止編譯器優化我們添加的volatile變量。我只是不同意Eric。 –
謝謝,我想盡可能多,認爲可能有更多的保存上下文時使用異步/等待 – aprofessionalpirate