事务中的线程信号
Thread Signaling Within Transaction
我目前正在使用英特尔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实现中。
相关文章:
- 线程之间的布尔停止信号
- 通过安装信号处理程序关闭多线程应用程序
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 发出信号以从线程更新 UI
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- 从另一个线程发出信号是否安全?
- boost信号和插槽在不同的线程中不工作(使用boost::asio::io_service)
- Qt:向死/停止线程发送信号
- 多线程.如果我使用信号量,我可以在开始时创建很多线程还是应该只有几个线程?
- Qt5 跨线程信号和插槽
- 在另一个线程上发出 QObject 信号的正确方法?
- Qt5 多线程:信号仅单向工作
- 将信号从工作线程类连接到控制器类 - QThreads
- 信号/插槽多线程 Qt
- Qt-使用信号和具有不同线程的插槽
- 是否可以向特定的线程 ID 发送信号?
- QT 4.8,如何从不同线程发送信号
- 一个类中的QT信号/插槽,但从不同的线程发出
- glib:在另一个线程上处理自定义 GMainContext* 循环,不引发信号处理程序
- 如果信号线程被阻塞,为什么接收线程中不处理信号