Попытка использовать функцию статического мьютекса, чтобы сделать поток кода безопасным.Проблема заключается не в том, что все компиляторы инициализируют статические переменные функции потокобезопасным способом.
void Initialize()
{
static Mutex L; // can't be initialized at compile time because constructor calls CreateMutex()
L.Lock()
// call thread unsafe code
L.Unlock()
}
Вот уже рассмотренные решения:
Объявите Mutex в глобальной области видимости, чтобыинициализация происходит перед main ().К сожалению, это не работает, когда есть глобальная переменная, чей конструктор вызывает Initialize (), потому что в C ++ нет гарантии того, что глобальные переменные порядка инициализируются
Использование атомарных операций
void Initialize()
{
static volatile uint16_t lock=0; // trivial initialization can happen @ compile time
while (AtomicExchange(lock,(uint16_t)1)!=0); // swap lock with 1 and return previous value
// call thread unsafe code
lock=0;
}
Это работает, но имеет недостаток - занятое ожидание
Использовать инициализатор времени компиляции pthread
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
К сожалению, это для Windows, и мы стараемся избегать использования pthread
Оцените решение, портативное .Я знаю, что в C ++ 2011 статическая инициализация функции является поточно-ориентированной, но мы избегаем C ++ 2011, потому что некоторые встроенные платформы могут иметь ненадежную поддержку C ++ 2011.