Есть ли способ реализовать одиночный объект в С++, который:
- Леной построена в потоковом безопасном режиме (два потока могут одновременно быть первым пользователем одноэлементного устройства - он все равно должен быть построен только один раз).
- Не полагается на статические переменные, которые создаются заранее (поэтому одноэлементный объект сам по себе безопасен для использования при построении статических переменных).
(я не очень хорошо знаю свой С++, но в этом случае инициализируются интегральные и постоянные статические переменные перед выполнением любого кода (т.е. даже до статических конструкторов) их значения могут уже быть "инициализированы", в образ программы)? Если это так - возможно, это может быть использовано для реализации одноэлементного мьютекса, который, в свою очередь, может использоваться для защиты создания реального синглтона..)
Отлично, кажется, что у меня есть несколько хороших ответов (стыд, я не могу отметить 2 или 3 как ответ). Кажется, существуют два широких решения:
- Используйте статическую инициализацию (в отличие от динамической инициализации) статической переменной POD и реализацию моего собственного мьютекса с использованием встроенных атомных инструкций. Это был тот тип решения, о котором я говорил в своем вопросе, и, я думаю, я уже знал.
- Используйте некоторую другую библиотечную функцию, например pthread_once или boost:: call_once. Об этом я, конечно, не знал - и очень благодарен за опубликованные ответы.