我不明白为什么以下代码不会导致潜在的竞争条件。看起来count
和totalBytes
是可以通过多个回调函数访问的变量,我觉得count--
和totalBytes += stats.size
可能导致比赛,因为您无法保证回调函数的订单传递给fs.stat()
(因为它是一个IO操作)。
var fs = require('fs');
var count = 0,
totalBytes = 0;
function calculateByteSize() {
fs.readdir(".", function (err, filenames) {
var i;
count = filenames.length;
for (i = 0; i < filenames.length; i++) {
fs.stat("./" + filenames[i], function (err, stats) {
totalBytes += stats.size;
count--;
if (count === 0) {
console.log(totalBytes);
}
});
}
});
}
calculateByteSize();
答案 0 :(得分:4)
Javascript只有一个线程,因此一次只能有一个回调修改count
。但是,无法保证回调顺序。
答案 1 :(得分:0)
如果您已达到异步函数计数,则可以,这里存在争用情况。但是您的函数是同步的,这意味着您的函数是原子的。由于这个原因,这里没有比赛条件。如果您在此处使用了异步功能,尽管有单线程,但由于事件循环中的上下文切换,因此发生了竞态条件。