gpt4 book ai didi

linux - 源中的上下文切换

转载 作者:太空宇宙 更新时间:2023-11-04 13:02:54 24 4
gpt4 key购买 nike

以下源代码是一个队列类:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com