Сигнализация потока внутри транзакции

В настоящее время я играю с Intel TSX (расширения синхронизации транзакций), которые доступны на новых чипах Intel Haswell, и я думал о том, как правильно передавать сигналы между различными потоками. Я попытался использовать переменную условия pthread, и транзакция просто продолжает прерываться, что вроде бы понятно. Тем не менее, кто-нибудь знает какие-нибудь эффективные способы сигнализировать другому потоку о пробуждении, если текущий находится внутри транзакции?

void firstThread()     
{
    if ((status = _xbegin()) == _XBEGIN_STARTED) {
        if(someCondition) {
            // signal secondThread to wake up
        }
    }
    else {
        cerr << "Transaction failed\n";
    }
    _xend();
}

void secondThread()
{
    waitForSignal();
    // do something
}

person Charles Khunt    schedule 06.11.2013    source источник
comment
Это противоречит основной идее параллельной работы критических секций, не так ли? От кого именно вы охраняете критическую секцию?   -  person Leeor    schedule 06.11.2013


Ответы (1)


Фундаментальный контракт транзакции — это изоляция состояния от других потоков до момента фиксации. В результате вы не сможете передавать какие-либо сигналы, оставаясь при этом транзакционными**.

Рассмотрим два потока: один работает без транзакций, ожидая у барьера, а другой достигает барьера, но выполняет транзакцию. Если нетранзакционный поток продолжается, а затем транзакционный поток откатывается по какой-либо независимой причине, то нетранзакционный поток будет работать безудержно и не сможет вернуться к барьеру постфактум!

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


**: В будущем для некоторых архитектур могут быть исключения. Транзакционные расширения архитектуры POWER предлагают модель приостановки транзакций, которая позволяет чередовать нетранзакционный и транзакционный код в одном потоке. Однако эта поддержка еще не реализована в реальном оборудовании и, конечно же, не реализована в RTM-реализации Intel.

person Matthew G.    schedule 15.11.2013