История изменений
Исправление 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 это скорее резиновая женщина, а не поток. поэтому мьютексов в джиесе нет и быть не может