Критические секции в JavaScript

228
06 августа 2018, 18:20

нужна помощь в создании аналога критической секции на javascript, то есть вход следующей функции в критическую секцию должен выполняться после выхода предыдущей, вот что есть сейчас:

class CriticalSection { 
  constructor() { 
    this._flag = false; 
  } 
 
  enter() { 
    if (!this._flag) { 
      return new Promise((resolve, reject) => { 
        this._flag = true; 
        setTimeout(() => resolve(), 3000); 
      }); 
    } else { 
      //здесь нужно какое-то ограничение 
    } 
  } 
 
  leav() { 
    this._flag = false; 
  } 
} 
let cs = new CriticalSection(); 
 
cs.enter().then((value) => { 
  setTimeout(() => { 
    console.log(`1`); 
    cs.leav(); 
  }, 2000) 
}, null); 
 
 
cs.enter().then((value) => { 
  setTimeout(() => { 
    console.log(`2`); 
    cs.leav(); 
  }, 2000) 
}, null);

Answer 1

Если проверка на закрытие верной секции не требуется, можно заменить токен на флаг.

class CriticalSection { 
  constructor() { 
    this.queue = [] 
    this.token = null 
  } 
 
  enter() { 
    return new Promise((resolve, reject) => { 
      if (this.token) { 
        this.queue.push(() => resolve(this.token = {})) 
      } else { 
        resolve(this.token = {}) 
      } 
    }) 
  } 
 
  leave(token) { 
    if (this.token !== token) { 
      throw new Error("Leaving the wrong section") 
    } 
     
    if (this.queue.length) { 
      this.queue.shift()() 
    } else { 
      this.token = null 
    } 
  } 
} 
 
let cs = new CriticalSection(); 
 
cs.enter().then(token => { 
  console.log("Entered #1") 
  setTimeout(() => { 
    console.log("Timeout #1"); 
    cs.leave(token); 
    console.log("Left #1"); 
  }, 2000) 
}, null); 
 
cs.enter().then(token => { 
  console.log("Entered #2") 
  setTimeout(() => { 
    console.log("Timeout #2"); 
    cs.leave(token); 
    console.log("Left #2"); 
  }, 2000) 
}, null);

READ ALSO
Не могу установить время в плеере

Не могу установить время в плеере

При клике значение CurrentTime сбрасывается до 0

163
Кнопка меняет цвет при нажатии JSON

Кнопка меняет цвет при нажатии JSON

Доброе время суток всемРебята ,сижу ломаю голову как сделать чтоб нажимаешь на кнопку и она стала зеленого цвета и рядом в диве высветилась...

239
Почему таблица закрывается?

Почему таблица закрывается?

При добавлении свойства "responsive: true" к "#reservations" и при нажатии на дочернюю строку - таблица открывается и закрываетсяПомогите мне пожалуйста

169
Зацикливание while при вводе строки через prompt

Зацикливание while при вводе строки через prompt

Есть две переменные, в которые записываются данные:

175