gpt4 book ai didi

Javascript原子系列操作

转载 作者:行者123 更新时间:2023-11-28 00:22:51 24 4
gpt4 key购买 nike

给定以下 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/

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