Метод isLocked для использования в haswell RTM

В настоящее время я занимаюсь разработкой приложения с использованием Intel Haswell RTM (аппаратная поддержка транзакционной памяти). Из того, что я мог видеть Вот а также Вот, Рекомендуемая процедура заключается в использовании какой-либо резервной блокировки в случае сбоя транзакции.

Рекомендуемый поток следующий:

someTypeOfLock fallback_lock;
if(_xbegin == _XBEGIN_STARTED) {
if(fallback_lock.isLocked()) // put the lock into the transaction read_set
_xabort();
// do stuff
_xend();
}
else{
fallback_lock.acquire();
// do stuff
fallback_lock.release();
}

Мой вопрос с функцией isLocked (). До сих пор я не нашел ни одной основной библиотеки / класса, которые бы обеспечивали эту функциональность (которая, как видно Вот, в большинстве случаев бесполезно). У вас есть какие-нибудь рекомендации?

Спасибо!

1

Решение

Энди Клин предложил здесь с помощью pthread_mutex_trylock (с некоторыми оговорками).
Есть также несколько слайдов, в которых упоминается использование этого для lock_is_locked () Вот.
Первая ссылка утверждает, что trylock будет успешной в RTM благодаря специальной адаптации HW, я не совсем уверен, как этот механизм будет работать, поэтому я не уверен, что могу рекомендовать это.

Вместо этого, я думаю, я бы лично выбрал более прямой подход к использованию любой разделяемой переменной, установив ее в резервном атомарном разделе с защитой от блокировки и читая его вместо try_lock. Что-то вроде этого —

someTypeOfLock fallback_lock;
if(_xbegin == _XBEGIN_STARTED) {
if(shared_var) // put the lock into the transaction read_set
_xabort();
// do stuff
_xend();
}
else{
fallback_lock.acquire();
shared_var = true;
// do stuff
shared_var = false;
fallback_lock.release();
}

Общая переменная служит блокировкой для плохого человека, конечно, запись и чтение в нее не защищены сами по себе, но, поскольку она находится в критической секции, она обеспечит точную семантику, которую вы хотите (чтение только в атомарной секции с попытками RTM, написать в резервном атомном разделе).

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

1

Другие решения

То, что вы хотите сделать, это «прочитать» блокировку, но без блокировки. Для этого вам нужно внимательно изучить библиотеку используемого вами замка. Ниже вы можете увидеть, как решить вашу проблему для мьютекса или спин-блокировки:

а) для спин-блокировки:

if ((int)spin_lock != 1) _xabort();

б) для мьютекса:

if (pthread_mutex_t.__data.__lock != 0) _xabort ();
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector