Информация об изменениях

Сообщение Re: Swap 2 buffers от 09.08.2019 3:55

Изменено 09.08.2019 4:09 Ssd13

Re: Swap 2 buffers
N>Есть два буфера, в один из которых что-то записывается в одном потоке, а другой, в который уже записалось, обрабатывается и выводится на консоль:

Выглядит, как стандартная задача производитель-потребитель (producer/consumer). Есть очередь, в которую производитель кладет указатели на буферы с готовыми данными, а потребитель их обрабатывает и ждет на условной переменной, когда нет готовых буферов. Если не хочется выделять память под буфер каждый раз (или по другой причине), то освобожденные буферы отдаются обратно через другую очередь. Тогда будет две очереди, два мьютекса и две условных переменных (для буферов идущих в одну сторону — с данными и в другую — пустыми). Возможно, в данной задаче очередь — это единственный указатель.

Можно сделать lockfree очереди, но тогда придется использовать специфические для OS примитивы для ожидания потока, когда ему нужно ждать (нет пустых буферов или нет заполненных). Для Linux — это futex, для Win есть аналог, начиная с win8 и 2012, кажется, для Mac, похоже, используют семафоры.
Re: Swap 2 buffers
N>Есть два буфера, в один из которых что-то записывается в одном потоке, а другой, в который уже записалось, обрабатывается и выводится на консоль:

Выглядит, как стандартная задача производитель-потребитель (producer/consumer). Есть очередь, в которую производитель кладет указатели на буферы с готовыми данными, а потребитель их обрабатывает и ждет на условной переменной, когда нет готовых буферов. Если не хочется выделять память под буфер каждый раз (или по другой причине), то освобожденные буферы отдаются обратно через другую очередь. Тогда будет две очереди, два мьютекса и две условных переменных (для буферов идущих в одну сторону — с данными и в другую — пустыми). Возможно, в данной задаче очередь — это единственный указатель.

Можно сделать lockfree очереди, но тогда придется использовать специфические для OS примитивы для ожидания потока, когда ему нужно ждать (нет пустых буферов или нет заполненных). Для Linux — это futex, для Win есть аналог, начиная с win8 и 2012, кажется, для Mac, похоже, используют семафоры.

Еще, в конкретно этой задаче, возможно, можно сделать, чтобы оба потока работали в режиме считал данные в буфер-обработал-считал-обработал. И, если чтение или обработка требуют эксклюзивного доступа — использовать мьютексы (один на чтение в буфер, другой на обработку). Останется только гарантировать упорядочивание обработки, чтобы ранее считанные данные и обработаны были раньше, но с мьютексами это совсем просто.