我的计数器变量对并发任务安全吗?

时间:2019-05-30 11:19:29

标签: javascript node.js callback

下面的计数器线程安全吗?我认为,如果我通过异步功能达到同步功能,则计数器会正常工作。我对吗?我的解释是函数a()是同步函数。这意味着该函数是原子的,这就是为什么只有一个进程在其中起作用的原因。这还意味着计数器安全地增加了吗?

    `var counter = 0;
     function a(){
     counter++
     }
     async function count(){
      //IO code;
      a();
     } 
     count();`

1 个答案:

答案 0 :(得分:1)

是的,代码是线程安全的。大多数值(SharedArrayBuffers除外)无法在线程之间共享,因此不能由两个不同的线程同时访问。

正如您提到的“异步函数”:它们异步运行是指它们可能在指定的点处停止(基本上在您await时),然后可能会运行其他代码,但是所有其他代码将一直运行到完成(因此,其他代码可能仅在使用await时才在它们之间运行)。

可能会失败的同一操作的示例:

  counter = counter + await Promise.resolve(1);

这可能会失败,因为counter得到了评估,诺言得到了await,与此同时其他代码也可能改变了counter,然后又分配回了counter