Может ли нестандартная библиотека избежать гонки данных в стандартном C++? ⇐ C++
-
Anonymous
Может ли нестандартная библиотека избежать гонки данных в стандартном C++?
Рассмотрим следующий пример:
bool lock(); // предоставлено системой Бул разблокировать(); // предоставлено системой статический int v = 0; //поток 1 недействительный вызов () { замок(); v = 1; // №1 разблокировать(); } // поток 2 недействительный вызов2 () { замок(); v = 2; // #2 разблокировать() } Предположим, что lock и unlock — это мьютекс, предоставляемый системой, они предотвратят #1 и < code>#2 от создания гонки данных, если они могут установить связь «произошло до». Однако [intro.races] p10 говорит
Оценка A происходит до оценки B (или, что то же самое, B происходит после A), если:
[*]A располагается перед B или [*]Межпоточный обмен происходит до B.
Для оценок в двух потоках мы ожидаем, что синхронный установит связь «произошло до». Однако синхронность определена для стандартной библиотеки, например, для некоторых атомарных операций или std::mutex. Стандарт не определял концепции синхронизации для других нестандартных библиотек. Следовательно, с точки зрения стандарта C++, мы не получаем синхронности при использовании lock() и unlock, даже если это предусмотрено системой.
То есть синхронной может быть только стандартная библиотека, потому что стандарт прямо так говорит? В зависимости от нестандартной библиотеки может возникнуть UB, даже если библиотека предоставляется системой и в документе API указано, что она позволяет избежать гонки данных.
Рассмотрим следующий пример:
bool lock(); // предоставлено системой Бул разблокировать(); // предоставлено системой статический int v = 0; //поток 1 недействительный вызов () { замок(); v = 1; // №1 разблокировать(); } // поток 2 недействительный вызов2 () { замок(); v = 2; // #2 разблокировать() } Предположим, что lock и unlock — это мьютекс, предоставляемый системой, они предотвратят #1 и < code>#2 от создания гонки данных, если они могут установить связь «произошло до». Однако [intro.races] p10 говорит
Оценка A происходит до оценки B (или, что то же самое, B происходит после A), если:
[*]A располагается перед B или [*]Межпоточный обмен происходит до B.
Для оценок в двух потоках мы ожидаем, что синхронный установит связь «произошло до». Однако синхронность определена для стандартной библиотеки, например, для некоторых атомарных операций или std::mutex. Стандарт не определял концепции синхронизации для других нестандартных библиотек. Следовательно, с точки зрения стандарта C++, мы не получаем синхронности при использовании lock() и unlock, даже если это предусмотрено системой.
То есть синхронной может быть только стандартная библиотека, потому что стандарт прямо так говорит? В зависимости от нестандартной библиотеки может возникнуть UB, даже если библиотека предоставляется системой и в документе API указано, что она позволяет избежать гонки данных.
Мобильная версия