1

我目前正在使用较新的 Intel Haswell 芯片上可用的 Intel TSX(事务同步扩展),并且我一直在考虑如何正确地在不同线程之间进行信号传递。我尝试使用 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
}
4

1 回答 1

1

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

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

一般来说,在事务编程模型中,任何不能回滚的东西都必须中止事务,因此您必须将信号代码移到事务之外。


**:未来某些架构可能会有例外。POWER 体系结构的事务扩展为事务提出了一个暂停模型,允许在单个线程中交错非事务代码和事务代码。然而,这种支持还没有出现在真正的硬件中,当然也没有出现在英特尔的 RTM 实现中。

于 2013-11-15T18:54:37.093 回答