linux - 源中的上下文切换

标签 linux multithreading g++

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

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/

相关文章:

c++ - C++ 中的运算符重载

c++ - 对由非 T 类型的值初始化的 const T 的引用

python - 如何通过外部 python 脚本在 Django shell 中执行代码?

linux - Linux 操作系统是否需要单独的 selenium jar 文件集?

multithreading - Akka Actor 优先级

Java - 客户端在连接时给出错误

c++ - 为什么在 Eclipse 中出现 "unrecognised emulation mode: 32"错误?

php - 普通 LAMP 网络服务器上 PHP 文件的正确 FTP 权限是多少?

C++。如何在 Linux 中跟踪 .so 模块的内存分配

java - LinkedBlockingQueue put 和 take 功能实现