【发布时间】:2015-03-03 19:15:04
【问题描述】:
我只是想知道下面的代码中是否出现了竞态条件:
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 不是易失性的,为什么我看不到这种竞争条件的效果?
【问题讨论】:
-
当然,async/await 使用当前同步上下文的全部方式意味着 有 适当的“同步习语”到位 - 你只是看不到他们。
-
代替
--readingFiles试试这个:var temp = readingFiles; Sleep(1000); readingFiles = temp - 1; -
你只运行了一个 ReadFile 实例,对吧?
标签: c# multithreading asynchronous async-await race-condition