交易中的线程信令

时间:2013-11-06 04:29:45

标签: c++ linux multithreading intel transactional-memory

我目前正在使用英特尔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
}

1 个答案:

答案 0 :(得分:1)

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

考虑两个线程,一个在非事务处运行,在屏障处等待,另一个到达屏障,但执行事务。如果非事务性线程继续进行,然后事务性线程被回滚,由于某些独立的原因,那么非事务性线程将会疯狂地运行,并且事后不能被带回障碍!

通常,在事务编程模型中,任何无法回滚的东西都必须中止事务,因此您必须在事务之外移动信令代码。


**:未来某些架构可能会有例外。 Transactional extentions to the POWER architecture提出了一种事务的暂停模型,它允许在单个线程中交错非事务性和事务性代码。但是,这种支持还不是真正的硬件,当然也不是英特尔的RTM实现。