Я использую InterlockedExchange в Windows, и у меня есть два вопроса, которые вместе составляют мой главный вопрос.
InterlockedExchange использует тип LONG (32 бита). Согласно документации Microsoft Доступ к заблокированным переменным: простые операции чтения и записи в 32-разрядные переменные являются атомарными операциями без InterlockedExchange. Согласно документации функции InterlockedExchange: Эта функция является атомарной по отношению к вызовам других заблокированных функций. Считывание / запись LONG в Windows без взаимосвязанных функций является атомарным или нет?
Я просматриваю код, в котором один поток устанавливает переменную, а затем все дальнейшие обращения к этой переменной этим потоком или любым количеством созданных им потоков используют InterlockedExchange. Чтобы упростить задачу, рассмотрите запущенный поток main()
создает поток, выполняющийся other()
:
LONG foo;
main()
{
foo = TRUE;
createthread(other());
/* do other things */
if(InterlockedExchange(&foo, 0))
{
cleanup()
}
}
other()
{
/* do other things */
if(InterlockedExchange(&foo, 0))
{
cleanup()
}
}
cleanup()
{
/* it's expected this is only called once */
}
Возможно ли в этом примере, что foo
не будет отображаться как ИСТИНА ни для одного из вызовов InterlockedExchange? Если main занят другими делами, так что первый вызов InterlockedExchange выполняется из другого потока, означает ли это foo гарантируется, что он был написан основным потоком и виден другим потоком в это время?
Извините, если это непонятно, я не знаю, как это лучше сформулировать.