源中的上下文切换
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 之间是无关紧要的。
以下来源是一个队列 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 之间是无关紧要的。