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

Несколько потоков периодически обновляют глобальные переменные, в то время как третий поток ожидает чтения

У меня есть два потока A, B, которые периодически обновляют две глобальные переменные чтения датчика, они выполняют одну и ту же процедуру. и третий поток C произведет некоторый расчет этих значений, как только они будут обновлены. Я установил некоторую переменную условия, чтобы, когда A и B обновляли глобальные переменные, C сразу же читал. Я обеспокоен тем, что поток C пропустил некоторые показания датчика из-за того, что он использует цикл, а опрос цикла организован после новых обновлений A, B. Я не уверен, что мои заботы необходимы, потому что я новичок в pthread. Моя среда разработки представляет собой встроенную плату Linux, и в настоящее время я изучаю pthread. Есть ли лучший способ, чем установка двух условных переменных для каждой глобальной переменной.


  • Лучше каким образом? Какая у вас проблема с условными переменными? У вас есть проблемы со сложностью кода? Представление? Гарантия правильности? Есть ли настоящий спор? Или этот доступ только случайный, и поэтому все, что имеет значение, это правильность? (Если да, то почему бы просто не использовать мьютекс?) 18.04.2012
  • Важно ли для C не пропускать обновления? Например, нормально ли, чтобы показания датчика А обновлялись дважды, прежде чем С начнет что-то делать с ним (поэтому С занимается только самыми последними показаниями) или это неприемлемо? Если последнее, то может потребоваться очередь, которая может содержать более одного чтения, или вам может потребоваться заблокировать поток производителя (A или B), пока C не найдет время для использования обновления. 18.04.2012

Ответы:


1

Я бы использовал один мьютекс, одну переменную условия и один счетчик генерации целого числа предикатов (просто обычное целое число, инициализированное нулем). Логика работает так:

Чтобы обновить значение: Заблокируйте мьютекс. Обновите значение. Увеличьте целое число предиката. Передайте переменную условия. Освободите мьютекс.

Чтобы прочитать текущее значение: Заблокируйте мьютекс. Сделайте копию значения счетчика генерации целочисленного предиката. Прочтите значение. Освободите мьютекс.

Чтобы проверить новое значение: Заблокируйте мьютекс. Сравните целое число предиката со значением, которое вы скопировали при последнем чтении значения. Если оно отличается, есть новое значение. Освободите мьютекс.

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

18.04.2012
  • целочисленный предикат рискует переполниться, вместо этого я устанавливаю флаги и поворачиваю их после завершения чтения. 18.04.2012
  • Переполнение безвредно, так как значение все равно изменится. Но если вы действительно параноик, вы можете обнулить его, как только он превысит миллиард. 18.04.2012
  • Если я правильно понимаю проблему, вам нужен один счетчик генерации (или флаги) для каждого из двух значений, чтобы C мог определить, какое чтение (или оба) было обновлено. 18.04.2012
  • Ты мог бы. И если вы хотите, чтобы потоки могли ожидать обновления определенной переменной, вам могут понадобиться две условные переменные. Это все варианты, которые вы можете сделать при реализации. 19.04.2012

  • 2

    Ваш другой вариант - простой мьютекс.

    pthread_mutex_t lockX = PTHREAD_MUTEX_INITIALIZER;
    
    [...]
    
    pthread_mutex_lock(lockX);
    // do things with shared variable
    pthread_mutex_unlock(lockX);
    

    Это относится к чтению и записи, так как даже с одним целым числом поток A может прочитать половину значения, затем поток B записывает в ту же переменную, а поток B продолжает читать другую половину , что приводит к «значению», которого никогда не существовало.

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

    18.04.2012
  • Не могли бы вы просветить меня, когда вы говорите, что поток A читает половину значения, затем поток B записывает в ту же переменную, а поток B продолжает читать другую половину, в результате чего значение никогда не существовало. 18.04.2012
  • Это именно то, что он сказал. Без надлежащей синхронизации операции чтения и записи могут перекрываться, что приводит к чтению половины старого значения и половины нового значения. Скажем, переменная содержит значение 93, а вы записываете в нее 31. Если я читаю в то же время, когда вы пишете, я могу прочитать 9, затем вы напишите 31, а затем я прочитаю 1, поэтому я думаю, что значение равно 91, чего никогда не было. 18.04.2012
  • Новые материалы

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

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

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

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

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

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

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