Когда я загружаю разделяемую библиотеку динамически, например, с помощью dlopen
в linux, мне нужно беспокоиться о видимости загруженной библиотеки между процессорами, или она будет автоматически ограждена / обеспечена безопасностью?
Например, скажем, у меня есть эта функция в загруженной библиотеке:
char const * get_string()
{ return "literal"; }
В основной программе использование такого строкового литерального указателя безопасно для нескольких потоков, поскольку все они гарантированно увидят его начальное значение. Однако мне интересно, как на самом деле правила «начальных значений» применяются к загруженной библиотеке (так как стандарт не имеет к этому особого отношения.
Скажите, что я загружаю библиотеку, а затем немедленно вызываю функцию get_string
. Я передаю указатель на другой поток через атомарную последовательность, не связанную с памятью (смягчено на языке C ++ 11). Может ли другой поток безопасно использовать этот указатель без необходимости выполнять какие-либо ограничения нагрузки или другие инструкции синхронизации?
Я предполагаю, что это безопасно. Возможно, из-за того, что новая библиотека будет загружена на новые страницы, другое ядро пока не может загрузить их, и, следовательно, не может иметь старой видимости на них?
Я бы хотел, чтобы какая-то авторская ссылка была частью ответа, если это возможно. Или техническое описание того, как это сделано потокобезопасным по умолчанию. Или, конечно, опровержение, если оно само по себе не является потокобезопасным.