语句块的原子执行

时间:2017-01-14 11:19:58

标签: c++ c++11 visual-c++ c++14

我有一系列我想以原子方式运行的语句。为简单起见,我们假设它们包含在一个块语句中:

{
    // statements...
}   

在C ++ 14中有没有直截了当的方式来做这样的事情?

为了澄清,我想要执行这个块就像它只是一个原子操作一样。我没有使用互斥锁保护的关键部分。问题是捆绑的操作应该在彼此之后执行,而不会在序列中的第一个和最后一个语句之间进行多次上下文切换。

2 个答案:

答案 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)