javascript 可以有竞争条件吗?

问题描述 投票:0回答:1

对于 javascript 中的以下代码,我想知道是否有并发 api 请求来增加计数,考虑到 javascript 是单线程的,是否有可能出现竞争条件。

  app.post('/increment', async (req, res) => {
    await someAsyncFunction(); // Asynchronous operation
    count++; // Increment operation
    res.send('Count incremented');
  });

据我了解,一旦在等待 someAsyncFunction() count++ 同步后恢复执行,就应该在执行恢复其他请求的增量之前一次性执行请求。如果我的理解有误,请告诉我。

javascript node.js mutex race-condition single-threaded
1个回答
0
投票

您可以使用互斥锁/锁 这是使用 async-mutex 库来防止并发增量的示例:

const { Mutex } = require('async-mutex');
const mutex = new Mutex();

app.post('/increment', async (req, res) => {
  await someAsyncFunction(); // Asynchronous operation

  // Lock access to count to prevent race condition
  const release = await mutex.acquire();
  try {
    count++;
  } finally {
    release(); // Ensure mutex is released
  }
  
  res.send('Count incremented');
});

这保证了一次只有一个请求可以增加计数,有效防止竞争情况。

另外,如果你不想使用这个包,你可以自己编写如下

let isLocked = false;

function acquireLock() {
  return new Promise((resolve) => {
    const tryAcquire = () => {
      if (!isLocked) {
        isLocked = true;
        resolve();
      } else {
        setTimeout(tryAcquire, 10); // If it is locked, it will retry every 10 milliseconds
      }
    };
    tryAcquire();
  });
}

function releaseLock() {
  isLocked = false;
}

app.post('/increment', async (req, res) => {
  await someAsyncFunction(); // Asynchronous operation

  await acquireLock(); // Lock access to count to prevent race condition
  try {
    count++;
  } finally {
    releaseLock(); // Ensure lock is released
  }

  res.send('Count incremented');
});

© www.soinside.com 2019 - 2024. All rights reserved.