The*_*ias 8 c# thread-safety threadpool async-await
当我使用async / await编写异步代码时,通常是ConfigureAwait(false)
为了避免捕获上下文,我的代码正在从一个线程池线程跳转到每个线程池之后await
。这引起了对线程安全性的担忧。此代码安全吗?
static async Task Main()
{
int count = 0;
for (int i = 0; i < 1_000_000; i++)
{
Interlocked.Increment(ref count);
await Task.Yield();
}
Console.WriteLine(count == 1_000_000 ? "OK" : "Error");
}
Run Code Online (Sandbox Code Playgroud)
该变量i
不受保护,可以由多个线程池线程访问*。尽管访问模式是非并行的,但是从理论上讲,每个线程都应该可以将的本地缓存值递增i
,从而导致超过1,000,000次迭代。我实际上无法产生这种情况。上面的代码在我的机器上始终可以正常打印。这是否意味着代码是线程安全的?或者我应该i
使用lock
?同步对变量的访问?
(*根据我的测试,平均每2次迭代发生一次线程切换)
线程安全的问题在于读/写内存。即使这可以在不同的线程上继续,这里也不会并发执行任何内容。
归档时间: |
|
查看次数: |
246 次 |
最近记录: |