LINUX.ORG.RU

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

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

Первый очевидный подводный камень - блокирующий поток не ждет следующего цикла в блокируемом, он сразу начинает что-то делать. Т.е. возможен такой сценарий:

  1. Пишущий поток начал что-то писать в буфер. Записал, скажем, половину. Тут его квант времени закончился, и он отправился в очередь ждать следующего.
  2. Второй поток выставил флаг и начал радостно из буфера читать. Прочитал буфер, записанный наполовину, сбросил флаг обратно и радостный пошел что-то с прочитанным мусором делать. Но тут его квант времени тоже кончился.
  3. Пишущий поток проснулся, дописал в буфер, проверил флаг, он уже сброшен читающим потоком обратно, поэтому для пишущего потока его состояние не изменилось. Он, пока время есть, еще раз наполовину успел буфер обновить. Тут опять квант кончился. И.т.д.

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

Первый очевидный подводный камень - блокирующий поток не ждет следующего цикла в блокируемом, он сразу начинает что-то делать. Т.е. возможен такой сценарий: 1. Пишущий поток начал что-то писать в буфер. Записал, скажем, половину. Тут его квант времени закончился, и он отправился в очередь ждать следующего. 2. Второй поток выставил флаг и начал радостно из буфера читать. Прочитал буфер, записанный наполовину, сбросил флаг обратно и радостный пошел что-то с прочитанным мусором делать. Но тут его квант времени тоже кончился. 3. Пишущий поток проснулся, дописал в буфер, проверил флаг, он уже сброшен читающим потоком обратно, поэтому для пишущего потока его состояние не изменилось. Он, пока время есть, еще раз наполовину успел буфер обновить. Тут опять квант кончился. И.т.д.