Javascript原子系列操作

标签 javascript concurrency atomic

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

相关文章:

javascript - 字符串时如何连接参数值

javascript - 创建横幅,动态使用目录中的所有图像

c# - 在 C# 中,Interlocked 类中是否有锁或队列?

c++ - 避免错误共享以提高性能

c# - C# 中的数组写入是原子的吗?

javascript - 输入框乘以2的结果出现在窗口中而不是div中

javascript - 将 Bootstrap 工具提示与 SVG 对象一起使用 - 尽管指定了容器但不显示

ios - 无法使用中央调度提高ios应用程序的运行速度

Java 发生在线程启动之前

c++ - 为什么 GCC 在 Clang 不使用它的地方插入 mfence?