Как отметил Тикер в комментарии, у вас есть условие гонки. (В любом случае нет необходимости во внутреннем, если оно находится в бесконечном цикле.)
if (! userStruct.inUse.load() )
{
//inUse might change in the middle printf
printf("** %d, %s\n\n", userStruct.inUse.load(), userStruct.name.c_str());
Sleep(500); //slower reading
}
else
printf("In Use!\n");
Решение состоит в том, чтобы "заблокировать" чтение, но простое выполнение следующих действий по-прежнему небезопасно:
if (! userStruct.inUse.load() ) //#1
{
//inUse might already be true here, so we didn't lock quickly enough.
userStruct.inUse=true; //#2
printf("** %d, %s\n\n", userStruct.inUse.load(), userStruct.name.c_str());
userStruct.inUse=false;
Sleep(500); //slower reading
}
Итак, действительно безопасный код - это объединить # 1, # 2 вместе:
bool f=false;
//Returns true if inUse==f and sets it to true
if(userStruct.inUse.compare_exchange_strong(f,true))
{
printf("** %d, %s\n\n", userStruct.inUse.load(), userStruct.name.c_str());
userStruct.inUse=false;
Sleep(500); //slower reading
}