глобальная переменная множественный читатель один писатель многопоточный безопасно? - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь написать программу на C ++ с одной глобальной переменной, которая читается несколькими потоками и обновляется одним потоком.В этом случае мне нужно написать любой семафор, похожий на вещи, или я могу просто оставить его как есть, поскольку только 1 поток фактически записывает в глобальную переменную, поэтому нет возможных условий гонки.

Также я новичок всемафор, так что мне нужно избавить себя от хлопот, если это возможно.

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

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

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

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

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

0 голосов
/ 26 октября 2018

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

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

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

0 голосов
/ 26 октября 2018

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

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

Если это простое целое число, которое вы пытаетесь прочитать / изменить из своих потоков, тогда вы можете использовать std :: atomic .

...