gpt4 book ai didi

c# - 异步/等待代码中的竞争条件

转载 作者:太空狗 更新时间:2023-10-29 17:46:00 25 4
gpt4 key购买 nike

我只是想知道下面的代码中是否出现了竞争条件:

int readingFiles;
async Task<string> ReadFile (string file)
{
++readingFiles;

var text = await Stream.ReadFileAsync(file);

--readingFiles;

return text;
}

如果 ReadFile 方法由线程池线程执行,则 readingFiles 将由两个不同的线程访问,并且 readingFiles 变量不受任何同步习语的保护。

这意味着对 readingFiles 的第一次更新不应该对执行“--readingFiles”的其他线程可见。但是,我从未见过 readingFiles 在“--readingFiles”之后等于 -1。我通过使用 Thread.CurrentThread 检查是否同一线程执行++ 和 -- 操作。在大多数情况下,它不是同一个线程,我仍然没有看到 readingFiles 为 -1。

即使存在竞争条件并且 readingFiles 不是易变的,为什么我看不到这种竞争条件的影响?

最佳答案

这里没有竞争条件。 .NET 运行时将插入适当的内存屏障。

另请参阅以下评论:http://blogs.msdn.com/b/pfxteam/archive/2012/04/12/async-await-faq.aspx

Yes, TPL includes the appropriate barriers when tasks are queued and at the beginning/end of task execution so that values are appropriately made visible.

关于c# - 异步/等待代码中的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28840059/

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