Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用原子指令实现C++锁?_C++_Multithreading_Concurrency_Locking_Atomic - Fatal编程技术网

用原子指令实现C++锁?

用原子指令实现C++锁?,c++,multithreading,concurrency,locking,atomic,C++,Multithreading,Concurrency,Locking,Atomic,前几天我在一个网站上看到一个问题,起初我认为答案很琐碎,但后来我认为答案并不重要 如何使用原子指令实现锁?比较和交换是原子式检查某物价值的标准方法,但它旨在用于无锁设计,因此我感到困惑 当你说“使用原子指令的锁”时,你可能指的是自旋锁 自旋锁只是一个原子整数或布尔值,有两个值:锁定和解锁。锁定函数在while循环中执行原子比较和交换,直到它成功地将值从UNLOCKED修改为LOCKED,此时该线程拥有锁。unlock函数只是将原子的值重置回UNLOCKED class spin_lock {

前几天我在一个网站上看到一个问题,起初我认为答案很琐碎,但后来我认为答案并不重要


如何使用原子指令实现锁?比较和交换是原子式检查某物价值的标准方法,但它旨在用于无锁设计,因此我感到困惑

当你说“使用原子指令的锁”时,你可能指的是自旋锁

自旋锁只是一个原子整数或布尔值,有两个值:锁定和解锁。锁定函数在while循环中执行原子比较和交换,直到它成功地将值从UNLOCKED修改为LOCKED,此时该线程拥有锁。unlock函数只是将原子的值重置回UNLOCKED

class spin_lock
{
    constexpr int UNLOCKED = 0;
    constexpr int LOCKED = 1;

    std::atomic<int> m_value = 0;

public:
    void lock()
    {
        while (true)
        {
            int expected = UNLOCKED;
            if (m_value.compare_exchange_strong(expected, LOCKED))
                break;
        }
    }

    void unlock()
    {
        m_value.store(UNLOCKED);
    }
};

说原子比较和交换指令用于无锁设计也是不正确的;它们对所有形式的同步都非常重要。

当你说“使用原子指令的锁”时,你可能指的是自旋锁

自旋锁只是一个原子整数或布尔值,有两个值:锁定和解锁。锁定函数在while循环中执行原子比较和交换,直到它成功地将值从UNLOCKED修改为LOCKED,此时该线程拥有锁。unlock函数只是将原子的值重置回UNLOCKED

class spin_lock
{
    constexpr int UNLOCKED = 0;
    constexpr int LOCKED = 1;

    std::atomic<int> m_value = 0;

public:
    void lock()
    {
        while (true)
        {
            int expected = UNLOCKED;
            if (m_value.compare_exchange_strong(expected, LOCKED))
                break;
        }
    }

    void unlock()
    {
        m_value.store(UNLOCKED);
    }
};

说原子比较和交换指令用于无锁设计也是不正确的;它们对所有形式的同步都非常重要。

锁通常由CAS实现,原子提供CAS。那么问题是什么呢?你是说std::lock_guard是对我的问题的一个公平的回答?这里的问题是锁定通常涉及任务之间的切换。比较和交换足以检测是否已声明互斥。阻止当前进程,让另一个进程运行,并在互斥器可用时切换回当前进程,这需要了解所涉及的操作系统。我确实认为这是一个措词不当的问题……锁通常由CAS实现,而atomics提供CAS。那么问题是什么呢?你是说std::lock_guard是对我的问题的一个公平的回答?这里的问题是锁定通常涉及任务之间的切换。比较和交换足以检测是否已声明互斥。阻塞当前进程,让另一个进程运行,并在互斥器可用时切换回当前进程,这需要了解所涉及的操作系统。我确实认为这是一个措词不当的问题……因为CAS指令在循环中,使用compare\u exchange\u-Law不是更有效吗?因为CAS指令在循环中,使用比较交换不是更有效吗?