gpt4 book ai didi

c++ - 事务中的线程信号

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:01:16 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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


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

关于c++ - 事务中的线程信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19804137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com