事务中的线程信号

Thread Signaling Within Transaction

本文关键字:信号 线程 事务      更新时间:2023-10-16

我目前正在使用英特尔TSX(事务同步扩展),它在较新的英特尔Haswell芯片上可用,我一直在考虑如何正确执行不同线程之间的信令。我尝试使用 pthread 的条件变量,事务一直中止,这是可以理解的。也就是说,有没有人知道任何有效的方法来发出信号,如果当前线程在事务中,另一个线程唤醒?

void firstThread()     
{
    if ((status = _xbegin()) == _XBEGIN_STARTED) {
        if(someCondition) {
            // signal secondThread to wake up
        }
    }
    else {
        cerr << "Transaction failedn";
    }
    _xend();
}
void secondThread()
{
    waitForSignal();
    // do something
}

事务的基本契约是将状态与其他线程隔离,直到提交时间。因此,您将无法在保持事务性**的同时执行任何信令。

考虑两个线程,一个在屏障处以非事务方式运行等待,另一个到达屏障,但执行事务。如果非事务性线程继续,然后事务线程回滚,出于某种独立的原因,那么非事务性线程将疯狂运行,并且无法在事后恢复到屏障!

通常,在事务编程模型中,任何无法回滚的内容都必须中止事务,因此您必须将信令代码移出事务。


**:将来某些体系结构可能会有异常。对 POWER 架构的事务扩展为事务提供了一种挂起模型,该模型允许在单个线程中交错非事务性和事务性代码。但是,这种支持尚未在实际硬件中出现,当然也不在英特尔的RTM实现中。