У меня есть родительский и рабочий поток, у которых есть общий флаг bool и std :: vector. Родитель только читает (т.е. читает bool или вызывает my_vector.empty ()); рабочий только пишет.
Мои вопросы:
Нужно ли мне мьютекс защищать флаг bool?
Могу ли я сказать, что все операции чтения / записи bool по сути являются атомарными операциями? Если вы ответите «Да» или «Нет», откуда вы взяли информацию?
Недавно я слышал о GCC Atomic-builtin . Могу ли я использовать их, чтобы мой флаг считывался / записывался атомарно без использования мьютексов? В чем разница? Я понимаю, что встроенные функции Atomic сводятся к машинному коду, но даже мьютексы сводятся к инструкциям барьера памяти процессора, верно? Почему люди называют мьютексы конструкцией "уровня ОС"?
Нужно ли мне мьютекс защищать мой std :: vector? Вспомните, что рабочий поток заполняет этот вектор, в то время как родительский поток вызывает для него только empty () (т.е. только читает его)
. Я не считаю, что защита мьютекса необходима ни для bool, ни для вектора. Я рационализирую его следующим образом: «Хорошо, если я прочитаю общую память непосредственно перед ее обновлением ... это все еще нормально, я получу обновленное значение в следующий раз. Что еще более важно, я не понимаю, почему писатель должен быть заблокирован, пока чтение есть чтение, потому что, в конце концов, читатель только читает! »
Если бы кто-то мог указать мне правильное направление, это было бы просто замечательно. Я использую GCC 4.3 и 32-разрядную версию Intel x86. Большое спасибо!