Jquery 为什么这个回调函数不会导致竞争条件?
我不明白为什么下面的代码不会导致潜在的竞争条件。看起来Jquery 为什么这个回调函数不会导致竞争条件?,jquery,node.js,callback,Jquery,Node.js,Callback,我不明白为什么下面的代码不会导致潜在的竞争条件。看起来count和totalBytes是可以被多个回调函数访问的变量,我觉得count--和totalBytes+=stats.size可能会引起竞速,因为你不能保证传递给fs.stat()的回调函数的顺序(因为这是一个IO操作) var fs=require('fs'); 变量计数=0, totalBytes=0; 函数calculateByteSize(){ fs.readdir(“.”),函数(错误,文件名){ var i; count=fi
count
和totalBytes
是可以被多个回调函数访问的变量,我觉得count--
和totalBytes+=stats.size
可能会引起竞速,因为你不能保证传递给fs.stat()
的回调函数的顺序(因为这是一个IO操作)
var fs=require('fs');
变量计数=0,
totalBytes=0;
函数calculateByteSize(){
fs.readdir(“.”),函数(错误,文件名){
var i;
count=filenames.length;
对于(i=0;i
Javascript只有一个线程,因此一次只能有一个回调修改计数。但是,回调的顺序不能保证。Javascript只有一个线程,因此一次只能修改一个回调count
。但是,回调的顺序不能保证。如果您已达到异步计数函数,则此处存在争用条件。但是你的函数是同步的,这意味着你的函数是原子的。由于这个原因,这里没有比赛条件。如果您在此处使用了异步函数,尽管是单线程,但由于事件循环中的上下文切换,已发生争用条件。如果您已达到异步函数的计数,则此处存在争用条件。但是你的函数是同步的,这意味着你的函数是原子的。由于这个原因,这里没有比赛条件。如果您在这里使用了异步函数,尽管是单线程,但由于事件循环中的上下文切换,出现了争用情况。为什么回调的顺序会影响结果?你所做的就是加减法。就像你改变了你在数学方程式中加入的数值一样,你仍然会得到相同的结果。你说的赛车是什么意思?count是目录中的一个常量,与@adam0101注释完全一致。你需要解释一下,你的代码片段是什么意思。不管回调的方式如何,最终结果都是一样的。根据J Morris的回答,我猜chen认为JS支持多线程,但如果我错了,请chen纠正我。为什么回调的顺序会影响结果?你所做的就是加减法。就像你改变了你在数学方程式中加入的数值一样,你仍然会得到相同的结果。你说的赛车是什么意思?count是目录中的一个常量,与@adam0101注释完全一致。你需要解释一下,你的代码片段是什么意思。不管回调的方式如何,最终结果都是一样的。根据J Morris的回答,我猜chen认为JS支持多线程,但如果我错了,请chen纠正我。嗯,显然web workers可以是多线程的,所以这可能取决于代码的执行方式@adam0101-但即使这段代码是在一个webWorker中,它也是在一个webWorker中,每个webWorker只有一个JS线程,所以仍然没有争用条件。这是nodejs代码,nodejs中没有webWorkers。嗯,显然webWorkers可以是多线程的,所以这可能取决于代码的执行方式@adam0101-但即使这段代码是在一个webWorker中,它也是在一个webWorker中,每个webWorker只有一个JS线程,所以仍然没有争用条件。这是nodejs代码,nodejs中没有webworker。
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();