Безопасно ли вращать переменную в потоках пользовательского режима? - PullRequest
2 голосов
/ 22 апреля 2010

Я не совсем уверен, безопасно ли вращать переменную в потоках пользовательского режима, чтобы реализовать облегченный spin_lock, я посмотрел исходный код tbb, tbb_machine.h: 170,

//! Spin WHILE the value of the variable is equal to a given value
/** T and U should be comparable types. */
template<typename T, typename U>
void spin_wait_while_eq( const volatile T& location, U value ) {
    atomic_backoff backoff;
    while( location==value ) backoff.pause();
}

И как я вижу, в классе atomic_backoff нет ограждений.В то время как из другой реализации spin_lock в пользовательском режиме, большинство из них используют CAS (Compare и Swap).

Ответы [ 2 ]

2 голосов
/ 22 апреля 2010

Tricky. Я бы сказал, что в теории этот код небезопасен. Если нет никаких барьеров памяти, тогда доступ к данным, который вы защищаете, может быть перемещен через спин-блокировку. Тем не менее, это будет сделано только в том случае, если компилятор будет очень агрессивным и сможет увидеть цель в этом переупорядочении.

Возможно, Intel просто определила, что этот код работает на всех текущих компиляторах, и что даже если компилятор теоретически может выполнять преобразования, которые нарушат этот код, эти преобразования не будут ускорять программу, и так что компиляторы, вероятно, этого не сделают.

Другая возможность состоит в том, что этот код используется только в компиляторах, которые неявно реализуют барьеры памяти при доступе volatile. Компилятор Microsoft Visual C ++ (2005 и более поздние версии) делает это. Вы проверили, заключено ли это в блок #ifdef или аналогичный, применяя эту реализацию только к компиляторам, где volatile использует барьеры памяти?

0 голосов
/ 22 апреля 2010

Обратите внимание, что это спин wait , а не спин lock . Операция записи не задействована. Ничего не приобретено.

Если вы попытаетесь добавить операцию записи для завершения процесса блокировки, у вас будет неразрешимая гонка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...