作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我使用 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");
}
变量i
不 protected ,并且由多个线程池线程*访问。尽管访问模式是非并发的,但理论上每个线程应该可以增加本地缓存的值i
。 ,导致迭代次数超过 1,000,000 次。但我无法在实践中产生这种情况。上面的代码在我的机器上总是打印 OK。这是否意味着代码是线程安全的?或者我应该同步对 i
的访问使用 lock
的变量?
(*根据我的测试,平均每 2 次迭代发生一次线程切换)
最佳答案
线程安全的问题在于读/写内存。即使这可以在不同的线程上继续,这里也不会并发执行任何内容。
关于c# - 异步代码、共享变量、线程池线程和线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58264302/
我是一名优秀的程序员,十分优秀!