gpt4 book ai didi

c# - 异步代码、共享变量、线程池线程和线程安全

转载 作者:行者123 更新时间:2023-12-02 12:32:46 25 4
gpt4 key购买 nike

当我使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com