以下源代码是一个队列类:
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 返回 true 但在这个重要时刻它在执行 cell->data_ = data 之前进行上下文切换,是真的吗? 还是 A 点和 B 点之间不可能发生上下文切换?
最佳答案
Is it true ?
是的:上下文切换可以发生在 A 和 B 之间的任何一点。
但这不应该影响算法,这似乎是正确的:如果 __sync_bool_compare_and_swap
返回 true,那么您已经自动保留了位于 pos< 的单元格
,并且没有其他人会干扰该单元格,因此上下文切换是否发生在 A 和 B 之间是无关紧要的。
关于linux - 源中的上下文切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33468463/