LINUX.ORG.RU

История изменений

Исправление Unixson, (текущая версия) :

в js нет тредов. поток всего один, а worker_threads это скорее резиновая женщина, а не поток. поэтому кошерных мьютексов в джиесе нет и быть не может. в js/ts есть async/await зато. и поэтому в JS mutex выглядел бы как-то так.

class Mutex {
  constructor() {
    this.queue = [];
    this.locked = false;
  }

  lock() {
    return new Promise((resolve) => {
      if (this.locked) {
        this.queue.push(resolve);
      } else {
        this.locked = true;
        resolve();
      }
    });
  }

  unlock() {
    if (this.queue.length > 0) {
      const nextResolve = this.queue.shift();
      nextResolve();
    } else {
      this.locked = false;
    }
  }
}

// Usage example
const mutex = new Mutex();
const sharedResource = { value: 0 };

async function modifyResource() {
  await mutex.lock();
  try {
    // Critical section
    sharedResource.value++;
    console.log(`Resource value: ${sharedResource.value}`);
  } finally {
    mutex.unlock();
  }
}

// Simulate concurrent modifications
modifyResource();
modifyResource();
modifyResource();

НО! задачу ОПа это не решает. И JS никогда ее не решит. Потому что то что написано выше, это не мьютекс, а кал говна как и сама задача. Потому что в динамических языках мутировать переменные, а еще и асинхронно - это большой харам. некоторые конфиги линтера вообще настраивают так чтобы let нельзя было использовать и нельзя было присваивать свойства к объекту на лету (aka monkey patching).

Исправление Unixson, :

в js нет тредов. поток всего один, а worker_threads это скорее резиновая женщина, а не поток. поэтому кошерных мьютексов в джиесе нет и быть не может. в js/ts есть async/await зато. и поэтому в JS mutex выглядел бы как-то так.

class Mutex {
  constructor() {
    this.queue = [];
    this.locked = false;
  }

  lock() {
    return new Promise((resolve) => {
      if (this.locked) {
        this.queue.push(resolve);
      } else {
        this.locked = true;
        resolve();
      }
    });
  }

  unlock() {
    if (this.queue.length > 0) {
      const nextResolve = this.queue.shift();
      nextResolve();
    } else {
      this.locked = false;
    }
  }
}

// Usage example
const mutex = new Mutex();
const sharedResource = { value: 0 };

async function modifyResource() {
  await mutex.lock();
  try {
    // Critical section
    sharedResource.value++;
    console.log(`Resource value: ${sharedResource.value}`);
  } finally {
    mutex.unlock();
  }
}

// Simulate concurrent modifications
modifyResource();
modifyResource();
modifyResource();

НО! задачу ОПа это не решает. И JS никогда ее не решит. Потому что то что написано выше, это не мьютекс, а кал говна как и сама задача. Потому что в динамических языках мутировать переменные, а еще и асинхронно - это большой харам.

Исправление Unixson, :

в js нет тредов. поток всего один, а worker_threads это скорее резиновая женщина, а не поток. поэтому кошерных мьютексов в джиесе нет и быть не может. в js/ts есть async/await зато. и поэтому в JS mutex выглядел бы как-то так.

class Mutex {
  constructor() {
    this.queue = [];
    this.locked = false;
  }

  lock() {
    return new Promise((resolve) => {
      if (this.locked) {
        this.queue.push(resolve);
      } else {
        this.locked = true;
        resolve();
      }
    });
  }

  unlock() {
    if (this.queue.length > 0) {
      const nextResolve = this.queue.shift();
      nextResolve();
    } else {
      this.locked = false;
    }
  }
}

// Usage example
const mutex = new Mutex();
const sharedResource = { value: 0 };

async function modifyResource() {
  await mutex.lock();
  try {
    // Critical section
    sharedResource.value++;
    console.log(`Resource value: ${sharedResource.value}`);
  } finally {
    mutex.unlock();
  }
}

// Simulate concurrent modifications
modifyResource();
modifyResource();
modifyResource();

НО! задачу ОПа это не решает. И JS никогда ее не решит. Потому что то что написано выше, это не мьютекс, а кал говна как и сама задача. Потому что в динамических языках мутировать переменные, а еще и асинхронно это большой харам.

Исправление Unixson, :

в js нет тредов. поток всего один, а worker_threads это скорее резиновая женщина, а не поток. поэтому кошерных мьютексов в джиесе нет и быть не может. в js/ts есть async/await зато. и выглядит это уродство как-то так.

class Mutex {
  constructor() {
    this.queue = [];
    this.locked = false;
  }

  lock() {
    return new Promise((resolve) => {
      if (this.locked) {
        this.queue.push(resolve);
      } else {
        this.locked = true;
        resolve();
      }
    });
  }

  unlock() {
    if (this.queue.length > 0) {
      const nextResolve = this.queue.shift();
      nextResolve();
    } else {
      this.locked = false;
    }
  }
}

// Usage example
const mutex = new Mutex();
const sharedResource = { value: 0 };

async function modifyResource() {
  await mutex.lock();
  try {
    // Critical section
    sharedResource.value++;
    console.log(`Resource value: ${sharedResource.value}`);
  } finally {
    mutex.unlock();
  }
}

// Simulate concurrent modifications
modifyResource();
modifyResource();
modifyResource();

НО! задачу ОПа это не решает. И JS никогда ее не решит. Потому что то что написано выше, это не мьютекс, а кал говна как и сама задача.

Исправление Unixson, :

в js нет тредов. поток всего один, а worker_threads это скорее резиновая женщина, а не поток. поэтому кошерных мьютексов в джиесе нет и быть не может. в js/ts есть async/await зато. и выглядит это уродство как-то так.

class Mutex {
  constructor() {
    this.queue = [];
    this.locked = false;
  }

  lock() {
    return new Promise((resolve) => {
      if (this.locked) {
        this.queue.push(resolve);
      } else {
        this.locked = true;
        resolve();
      }
    });
  }

  unlock() {
    if (this.queue.length > 0) {
      const nextResolve = this.queue.shift();
      nextResolve();
    } else {
      this.locked = false;
    }
  }
}

// Usage example
const mutex = new Mutex();
const sharedResource = { value: 0 };

async function modifyResource() {
  await mutex.lock();
  try {
    // Critical section
    sharedResource.value++;
    console.log(`Resource value: ${sharedResource.value}`);
  } finally {
    mutex.unlock();
  }
}

// Simulate concurrent modifications
modifyResource();
modifyResource();
modifyResource();

НО! задачу ОПа это не решает. И JS никогда ее не решит. Потому что это не мьютекс а кал говна как и сама задача.

Исправление Unixson, :

в js нет тредов. поток всего один, а worker_threads это скорее резиновая женщина, а не поток. поэтому кошерных мьютексов в джиесе нет и быть не может. в js/ts есть async/await зато. и выглядит это уродство как-то так.

class Mutex {
  constructor() {
    this.queue = [];
    this.locked = false;
  }

  lock() {
    return new Promise((resolve) => {
      if (this.locked) {
        this.queue.push(resolve);
      } else {
        this.locked = true;
        resolve();
      }
    });
  }

  unlock() {
    if (this.queue.length > 0) {
      const nextResolve = this.queue.shift();
      nextResolve();
    } else {
      this.locked = false;
    }
  }
}

// Usage example
const mutex = new Mutex();
const sharedResource = { value: 0 };

async function modifyResource() {
  await mutex.lock();
  try {
    // Critical section
    sharedResource.value++;
    console.log(`Resource value: ${sharedResource.value}`);
  } finally {
    mutex.unlock();
  }
}

// Simulate concurrent modifications
modifyResource();
modifyResource();
modifyResource();

Исходная версия Unixson, :

в js нет тредов. поток всего один, а worker_threads это скорее резиновая женщина, а не поток. поэтому мьютексов в джиесе нет и быть не может