我有一系列我想以原子方式运行的语句。为简单起见,我们假设它们包含在一个块语句中:
{
// statements...
}
在C ++ 14中有没有直截了当的方式来做这样的事情?
为了澄清,我想要执行这个块就像它只是一个原子操作一样。我没有使用互斥锁保护的关键部分。问题是捆绑的操作应该在彼此之后执行,而不会在序列中的第一个和最后一个语句之间进行多次上下文切换。
答案 0 :(得分:4)
取决于“直截了当”的意思。我认为std::unique_lock非常直接易用。
{
std::unique_lock lock(m_mutex);
// sequence of operations
// lock destructor will release mutex
}
唯一的问题是,操作受互斥锁保护的变量的任何其他位置必须也执行相同的操作。
修改强>
回答澄清的问题:否。
要防止上下文切换,您必须使用正确的实时操作系统(RTOS),并使用其功能。如果您在Linux或Windows之类的通用操作系统下运行(visual-studio标签建议使用后者),您可以进行各种特定于平台的调用,这将使上下文切换不太可能 - 但您无法阻止它们。 / p>
(如果在内核模式下运行,上下文切换变得不太可能,但即使这样,也很难阻止中断处理程序和页面错误处理程序切入。)
答案 1 :(得分:3)
问题是:交易记忆。事务是具有 Atomicity ,一致性,隔离和 Durability (ACID)属性的操作。 Atomicity :执行块的全部或无声明。 一致性:系统始终处于一致状态。所有交易都构建了一个总订单。 隔离:每个事务都与其他事务完全隔离。
"事务是一种只在初始状态成立时才会提交的推测操作。这与互斥体是一种乐观的方法形成对比。事务在没有同步的情况下执行。只有在初始状态不发生冲突时才会发布。互斥是一种悲观的方法。首先,互斥锁确保没有其他线程可以进入关键区域。如果线程是互斥锁的独占所有者,则线程将仅进入关键区域,因此,所有其他线程都被阻止。" - Rainer Grimm
自版本6.1起,GCC支持事务内存(需要-fgnu-tm才能启用)。 (reference)