源中的上下文切换

context switch in the source

以下来源是一个队列 class :

template<typename T>
class mpmc_bounded_queue
{
public:
    bool enqueue(T const& data)
    {
        cell_t* cell;
        size_t pos  ;
        for (;;)
        {
            pos = enqueue_pos_ ;
            cell = &buffer_[pos & buffer_mask_];
            size_t seq = cell->sequence_;
            intptr_t dif = (intptr_t)seq - (intptr_t)pos;
            if (dif == 0)
            {
                //spot A
                if (__sync_bool_compare_and_swap(&enqueue_pos_,pos,pos+1) )
                    break;
            } else if (dif < 0)
            {
                return false;
            }else{
                pos = enqueue_pos_;
            }
        }
        // spot B 
        cell->data_ = data;
        cell->sequence_ = pos + 1 ;
        return true;
    } //enqueue
private:
    struct cell_t
    { 
        size_t     sequence_;
        T          data_;
    };
} ;

在 RedHat Enterprise Linux 7.0 x86_64 中,是否可以进行上下文切换 发生在完成 __sync_bool_compare_and_swap(A 点)但尚未完成 执行 cell->data_ = data(点 B)?

我已经说过上下文切换会发生在 recv 、 send 、 usleep 中, 与 I/O 函数有关,在这种情况下,许多线程执行 enqueue ,不可能存在线程完成的可能性 __sync_bool_compare_and_swap return 是的,但是在这个重要的时刻,它在执行 cell->data_ = data 之前先进行了上下文切换,是吗? 或者在 A 点和 B 点之间不可能发生上下文切换?

Is it true ?

是:上下文切换可以发生在 A 和 B 之间的任何一点。

虽然这不应该影响算法,这似乎是正确的:如果 __sync_bool_compare_and_swap 返回 true,那么您 原子地 保留了位于 [=11 的单元格=],没有其他人会干扰那个单元格,所以上下文切换是否发生在 A 和 B 之间是无关紧要的。