Поточно-ориентированный доступ к членам класса

Является ли одновременный доступ к двум разным членам класса одного и того же объекта из двух разных потоков POSIX потокобезопасным в C++ 03?


person user3329849    schedule 15.01.2015    source источник
comment
В C++ 03 не было стандартной модели памяти, поэтому ответить на этот вопрос с точки зрения стандарта C++ невозможно.   -  person kraskevich    schedule 15.01.2015
comment
Поскольку они являются разными участками памяти, хотя они должны быть потокобезопасными во всех смыслах, независимо от модели памяти/согласованности, то есть, если потоки не пытаются синхронизироваться на этих элементах.   -  person computador7    schedule 15.01.2015
comment
@computador7 нам нужна была модель памяти в C ++ именно потому, что то, что вы сказали, неверно - если компилятор не знает, что среда является многопоточной, он будет выполнять множество оптимизаций, которые часто включают в себя касание областей памяти, которых не должно быть в многопоточной среде. Окружающая среда. Тем не менее, -pthread должен хотя бы частично решить эту проблему.   -  person Griwes    schedule 15.01.2015
comment
О каких оптимизациях вы говорите? Прежде всего, если вы обращаетесь к разным ячейкам памяти из разных потоков, вы не получаете условия гонки. Теперь, если потокам необходимо видеть обновления других потоков в правильном порядке, вот тут-то и пригодится спецификация модели памяти! Далее, я не думаю, что есть области памяти, которые компилятор не должен трогать в многопоточной среде, и даже если бы они были, я не вижу, как те оптимизации, на которые вы ссылаетесь, все равно будут делать это! Не могли бы вы уточнить?   -  person computador7    schedule 15.01.2015
comment
-pthread связывает библиотеку pthread и некоторые макросы для повторного входа и локального хранилища потоков. Я не понимаю, как это связано с этим.   -  person computador7    schedule 15.01.2015


Ответы (1)


Нет (с легким голосом "да")

С точки зрения стандарта C++03 не существует такой вещи, как потоки, поэтому не существует никаких условий, при которых стандарт считал бы что-либо, связанное с параллелизмом, «безопасным».

Хотя это часто не проблема (при небольшой осторожности и надлежащих примитивах синхронизации, выходящих за рамки C++, это «все равно будет работать»), есть несколько вещей, о которых следует знать, среди них:

  • errno (и другие структуры) могут не быть локальными для потока. Параметр командной строки -pthread в основном решает эту проблему.
  • Члены класса могут создавать псевдонимы друг друга с помощью ссылок, указателей или объединений, поэтому изменение разных членов действительно может привести к одновременному изменению одного и того же члена.
  • Без модели памяти компилятору разрешено (и будет!) переупорядочивать загрузку и сохранение, а это означает, что, например, «очевидный» способ связи, заключающийся в первой записи фрагмента данных, а затем установке флага «данные готовы», может не работает, как ожидалось.
  • В Windows существуют некоторые неочевидные статические динамические проблемы CRT при наличии потоков, когда ваша программа загружает библиотеки DLL. Убедитесь, что все компоненты выполняют одно и то же действие (что бы это ни было).
  • Кроме того, некоторые старые версии CRT могут терять несколько сотен байтов памяти на поток (обычно это не проблема).
  • Неизменяемые объекты по своей сути потокобезопасны, как и доступ только для чтения из нескольких потоков.
person Damon    schedule 15.01.2015