我目前正在使用英特尔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
}
答案 0 :(得分:1)
事务的基本契约是状态与其他线程的隔离,直到提交时间。因此,在保留交易**时,您将无法执行任何信令。
考虑两个线程,一个在非事务处运行,在屏障处等待,另一个到达屏障,但执行事务。如果非事务性线程继续进行,然后事务性线程被回滚,由于某些独立的原因,那么非事务性线程将会疯狂地运行,并且事后不能被带回障碍!
通常,在事务编程模型中,任何无法回滚的东西都必须中止事务,因此您必须在事务之外移动信令代码。
**:未来某些架构可能会有例外。 Transactional extentions to the POWER architecture提出了一种事务的暂停模型,它允许在单个线程中交错非事务性和事务性代码。但是,这种支持还不是真正的硬件,当然也不是英特尔的RTM实现。