以下来源是队列类:
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-&gt; data_ = data(spot B)?
我已经告诉上下文切换会发生在recv,send,usleep, 与I / O函数有关,在这种情况下,当许多线程执行时 入队,不可能存在线程完成的可能性 __sync_bool_compare_and_swap返回true,但在此重要时刻,在执行cell-&gt; data_ = data之前,它是上下文切换,是真的吗? 在A点和B点之间不可能发生上下文切换?
答案 0 :(得分:0)
是真的吗?
是:上下文切换可以在A和B之间的任何点发生。
这不应该影响算法,但这似乎是正确的:如果__sync_bool_compare_and_swap
返回true,那么原子保留pos
处的单元格,并且没有人否则将干扰该单元格,因此上下文切换是否发生在A和B之间是无关紧要的。