Является ли одновременный доступ к двум разным членам класса одного и того же объекта из двух разных потоков POSIX потокобезопасным в C++ 03?
Поточно-ориентированный доступ к членам класса
Ответы (1)
Нет (с легким голосом "да")
С точки зрения стандарта C++03 не существует такой вещи, как потоки, поэтому не существует никаких условий, при которых стандарт считал бы что-либо, связанное с параллелизмом, «безопасным».
Хотя это часто не проблема (при небольшой осторожности и надлежащих примитивах синхронизации, выходящих за рамки C++, это «все равно будет работать»), есть несколько вещей, о которых следует знать, среди них:
errno
(и другие структуры) могут не быть локальными для потока. Параметр командной строки-pthread
в основном решает эту проблему.- Члены класса могут создавать псевдонимы друг друга с помощью ссылок, указателей или объединений, поэтому изменение разных членов действительно может привести к одновременному изменению одного и того же члена.
- Без модели памяти компилятору разрешено (и будет!) переупорядочивать загрузку и сохранение, а это означает, что, например, «очевидный» способ связи, заключающийся в первой записи фрагмента данных, а затем установке флага «данные готовы», может не работает, как ожидалось.
- В Windows существуют некоторые неочевидные статические динамические проблемы CRT при наличии потоков, когда ваша программа загружает библиотеки DLL. Убедитесь, что все компоненты выполняют одно и то же действие (что бы это ни было).
- Кроме того, некоторые старые версии CRT могут терять несколько сотен байтов памяти на поток (обычно это не проблема).
- Неизменяемые объекты по своей сути потокобезопасны, как и доступ только для чтения из нескольких потоков.
person
Damon
schedule
15.01.2015
-pthread
должен хотя бы частично решить эту проблему. - person Griwes   schedule 15.01.2015