Мне нужен семафор при чтении из глобальной структуры?

Похоже, что использованный вами пакет scikit старый. На самом деле вы можете обновить его до 0.20.x. В противном случае вы могли бы заставить его работать сначала методом Labelencoder ().

9
задан JXG 19 March 2009 в 07:38
поделиться

10 ответов

Большое спасибо всем выдающимся ответчикам (и за все замечательные ответы).

Подводя итог:

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

Это верно, даже если другой участникам пишут часто. Тот факт, что разные переменные являются частью одной и той же структуры, не имеет значения.

0
ответ дан 4 December 2019 в 08:53
поделиться

Вам нужно взаимное исключение, чтобы гарантировать, что операция является атомарной. Так в данном случае Вам, возможно, не понадобится взаимное исключение вообще. А именно, если каждый поток пишет в один элемент, и запись является атомарной, и новое значение независимо от текущего значения любого элемента (включая себя), нет никакой проблемы.

Пример: каждый из нескольких потоков обновляет "last_updated_by" переменную, которая просто записывает последний поток, который обновил его. Очевидно, пока сама переменная обновляется атомарно, никакие ошибки не произойдут.


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

Пример: поток обновляет "день", "месяц" и элементы "года" структуры. Это должно произойти атомарно, чтобы другой поток не считал структуру после инкрементов "месяца", но прежде чем "день" перенесется к 1, для предотвращения дат такой как 31 февраля. Обратите внимание, что необходимо соблюдать взаимное исключение при чтении; иначе можно считать ошибочное, полуобновленное значение.

7
ответ дан 4 December 2019 в 08:53
поделиться

Если read_only участник на самом деле только для чтения, то нет никакой опасности изменяемых данных и поэтому никакая потребность в синхронизации. Это могло быть данными, которые настраиваются, прежде чем потоки запускаются.

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

6
ответ дан 4 December 2019 в 08:53
поделиться

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

4
ответ дан 4 December 2019 в 08:53
поделиться

Если все потоки только читают, Вам не нужен семафор.

1
ответ дан 4 December 2019 в 08:53
поделиться

Читателям нужны взаимные исключения, также!

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

Вот то, почему, в форме примера.

Вообразите часы, которые обновляют каждую секунду с кодом:

if (++seconds > 59) {        // Was the time hh:mm:59?
   seconds = 0;              // Wrap seconds..
   if (++minutes > 59)  {    // ..and increment minutes.  Was it hh:59:59?
     minutes = 0;            // Wrap minutes..
     if (++hours > 23)       // ..and increment hours.  Was it 23:59:59?
        hours = 0;           // Wrap hours.
    }
}

Если код не защищен взаимным исключением, другой поток может читать hours, minutes, и seconds переменные, в то время как обновление происходит. После кода выше:

[Start just before midnight] 23:59:59
[WRITER increments seconds]  23:59:60
[WRITER wraps seconds]       23:59:00
[WRITER increments minutes]  23:60:00
[WRITER wraps minutes]       23:00:00
[WRITER increments hours]    24:00:00
[WRITER wraps hours]         00:00:00

Время недопустимо от первого инкремента до заключительной операции шесть шагов позже. Если читатель проверит часы в течение этого периода, то они будут видеть значение, которое может быть не только неправильным, но и недопустимым. И так как Ваш код, вероятно, будет зависеть от часов, не отображая время непосредственно, это - классический источник ошибок "рикошета", которые известно трудно разыскать.

Фиксация проста.

Окружите код обновления часов взаимным исключением и создайте функцию читателя, которая также блокирует взаимное исключение, в то время как это выполняется. Теперь читатель будет ожидать, пока обновление не завершено, и устройство записи не изменит считанные из середины значения.

3
ответ дан 4 December 2019 в 08:53
поделиться

Вы могли бы любить читать любую из этих газет на практической блокировке бесплатное программирование, или просто разделение и понимание обеспеченных отрывков.

1
ответ дан 4 December 2019 в 08:53
поделиться

Нет.

В целом Вам нужны семафоры для предотвращения параллельного доступа к ресурсам ( int в этом случае). Однако начиная с read_only участник только для чтения, это не изменится между/во время доступами. Обратите внимание, что это не должно даже быть атомарное чтение — если ничто не изменяется, Вы всегда в безопасности.

Как Вы устанавливаете read_only первоначально?

2
ответ дан 4 December 2019 в 08:53
поделиться

Я скрыл бы каждое поле позади позади вызова функции. Поля только для записи имели бы семафор. Только для чтения просто возвращает значение.

0
ответ дан 4 December 2019 в 08:53
поделиться

Добавление к предыдущим ответам:

  1. В этом случае естественная парадигма синхронизации является взаимным исключением, не семафорами.
  2. Я соглашаюсь, что Вам не нужно никакое взаимное исключение на переменных только для чтения.
  3. Если часть чтения-записи структуры будет иметь ограничения непротиворечивости, то в целом Вам будет нужно одно взаимное исключение для всех них для хранения операций атомарными.
0
ответ дан 4 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: