Nano Hash - криптовалюты, майнинг, программирование

Сообщите читателю, что писатель закончил писать, и подождите, пока читатель закончит чтение.

У меня есть следующий сценарий чтения-записи:

  1. Писатель зажигает читателя.
  2. Устройство чтения вращается бесконечно и начинает чтение из общего буфера после записи в него.
  3. Писатель начинает запись в общий буфер
  4. Писатель ждет, пока читатель закончит чтение.
  5. программа заканчивается.

Псевдокод - предположим, что все потокобезопасно:

// shared buffer
var buffer = new [3];

// 1. fire a thread, pass it a function named read
thread reader = new thread(read);

// 2. write some text to a shared buffer
var source = new [] {"line 1", "line 2", "line 3"};
for (int i = 0; ++i; i< source.length) {
   buffer[i] = source[i];
}

// 3. wait for reader to finish consuming the buffer
reader.join();


// 4. reader function
function void read() {
    while (true) {
        while (!buffer.empty()) {
           for (int i = 0; ++i; i< buffer.length) {
              print(buffer[i]);
           }
        }
    }
}

Мой вопрос: как заставить читателя выйти из его бесконечного цикла?

Я знаю, что это классическая проблема, но не смог найти ресурс, который занимается этим. Все, что я видел, связано с различными типами замков, что меня не интересует (как было сказано - предположим, что все потокобезопасно).


Ответы:


1

Используйте общий флаг, finished.

Когда модуль записи заканчивает писать свой контент, он устанавливает флаг finished = true.

Вместо того, чтобы позволить читателю бесконечно зацикливаться с while (true), завершите, когда установлен флаг, while (!finished).

03.01.2020
  • Обратите внимание, что в производственном коде лучше использовать условную переменную или какой-либо другой вид формального механизма сигнализации потока, а не опрос общей логической переменной, потому что циклы опроса либо тратят слишком много циклов ЦП (если они являются спин-циклами), либо вводят ненужные задержка (если они спят между опросами, чтобы попытаться не тратить процессор впустую). 03.01.2020
  • 1. Писатель запускает чтение 2. Читатель получает процессорное время, завершает оценку `!buffer.empty()' 3. Писатель возвращает процессорное время, записывает, устанавливает флаг 4. Читатель получает процессорное время 5. Читатель завершает работу без чтения 03.01.2020
  • @odyssey Снова проверьте буфер после завершения цикла. Если не пустой, обработайте его содержимое. 03.01.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..