Один читатель. Один писатель. Некоторые общие вопросы о мьютексах и встроенных атомарных модулях

У меня есть родительский и рабочий поток, у которых есть общий флаг bool и std :: vector. Родитель только читает (т.е. читает bool или вызывает my_vector.empty ()); рабочий только пишет.

Мои вопросы:

  • Нужно ли мне мьютекс защищать флаг bool?

  • Могу ли я сказать, что все операции чтения / записи bool по сути являются атомарными операциями? Если вы ответите «Да» или «Нет», откуда вы взяли информацию?

  • Недавно я слышал о GCC Atomic-builtin . Могу ли я использовать их, чтобы мой флаг считывался / записывался атомарно без использования мьютексов? В чем разница? Я понимаю, что встроенные функции Atomic сводятся к машинному коду, но даже мьютексы сводятся к инструкциям барьера памяти процессора, верно? Почему люди называют мьютексы конструкцией "уровня ОС"?

  • Нужно ли мне мьютекс защищать мой std :: vector? Вспомните, что рабочий поток заполняет этот вектор, в то время как родительский поток вызывает для него только empty () (т.е. только читает его)

  • . Я не считаю, что защита мьютекса необходима ни для bool, ни для вектора. Я рационализирую его следующим образом: «Хорошо, если я прочитаю общую память непосредственно перед ее обновлением ... это все еще нормально, я получу обновленное значение в следующий раз. Что еще более важно, я не понимаю, почему писатель должен быть заблокирован, пока чтение есть чтение, потому что, в конце концов, читатель только читает! »

Если бы кто-то мог указать мне правильное направление, это было бы просто замечательно. Я использую GCC 4.3 и 32-разрядную версию Intel x86. Большое спасибо!

7
задан Kostolma 16 August 2011 в 15:59
поделиться