给定以下 JavaScript 代码(或等效代码):
var buf = [];
setInterval(function () {
buf.push("token");
// If buf has something pushed here we are screwed
if (buf.length == 1) {
sendCriticalLog();
}
});
setInterval(function () {
buf.push("other token");
});
有没有办法保证第一个区间的函数对于buf
来说是原子的?
我能想到的唯一方法是:
function atomic(lock, cb){
var finish = function () {
lock.callbacks = lock.callbacks.slice(1);
if (lock.callbacks.length) {
lock.callbacks[0].call();
}
};
cb = cb.bind(null, finish);
if ((lock.callbacks = (lock.callbacks || []).concat([cb])).length == 1) {
// Nothing is running
lock.callbacks[0]();
};
}
var buf = [];
setInterval(function () {
atomic(buf, function () {
buf.push("token");
// If buf has something pushed here we are screwed
if (buf.length == 1) {
sendCriticalLog();
}
});
});
setInterval(function () {
atomic(buf, function () {
buf.push("other token");
});
});
但这是在假设 ((lock.callbacks = (lock.callbacks || []).concat([cb])).length == 1)
将保证以原子方式处理。例如,如果 concat
是用纯 JavaScript 编写的,这可能不起作用......
最佳答案
JavaScript 不是多线程的,因此您的回调实际上已经是“原子的”。 buf 只能在回调调用之间更改。
关于Javascript原子系列操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29818927/