C++ 无需硬件支持测试、设置和CAS操作的互斥实现

C++ 无需硬件支持测试、设置和CAS操作的互斥实现,c++,x86,atomic,compare-and-swap,test-and-set,C++,X86,Atomic,Compare And Swap,Test And Set,我们有以下简单的互斥定义: class Mutex { private: bool lock; public: void acquire(); void release(); Mutex() { lock = 0; } }; 以及以下acquire()func实现(使用比较和交换操作): 在这种情况下,我们得到以下汇编代码: movzx eax, BYTE PTR [rsp+15] lock cmpxchg BYTE PTR

我们有以下简单的互斥定义:

class Mutex {
private:
    bool lock;
public:
    void acquire();

    void release();

    Mutex() {
        lock = 0;
    }
};
以及以下
acquire()
func实现(使用比较和交换操作):

在这种情况下,我们得到以下汇编代码:

movzx   eax, BYTE PTR [rsp+15]
lock cmpxchg    BYTE PTR [rbx], bpl
je      .L9
    mov     eax, ebp
    xchg    al, BYTE PTR [rbx]
    test    al, al
    jne     .L6
或者在使用
\u原子测试\u和\u集的情况下

void Mutex::acquire() {
    while (__atomic_test_and_set(&lock, 0)) {
        sched_yield();
    }
}
我们得到以下汇编代码:

movzx   eax, BYTE PTR [rsp+15]
lock cmpxchg    BYTE PTR [rbx], bpl
je      .L9
    mov     eax, ebp
    xchg    al, BYTE PTR [rbx]
    test    al, al
    jne     .L6
但是,如果我们没有原子测试、集合和CAS操作的硬件支持(
xchg
lock-cmpxchg
在x86上,以及在其他体系结构上的等效操作),该怎么办?
在这种情况下,编译器将使用什么解决方案


附言——我使用gcc 8.2生成了汇编代码,下面是
\uuuuuu原子内置函数:

投票结束,因为“太宽”。除非硬件具有一些原子操作,否则无法实现互斥。除非我们知道它们是什么,否则我们无法告诉编译器将如何实现它。C++11要求无锁,并且可以用它来构建互斥(旋转锁不需要CAS,只需要TA)。在无法实现测试、设置和清除某个宽度以便可以实现
std::atomic_flag
的硬件上,无法实现C++11,只能实现该标准的早期版本。您可能仍然能够实现互斥体,这取决于您所构建的块。C++的答案将取决于是否可以回答问题。如果平台允许创建任何互斥体,那么可以讨论如何为它们实现C++ API,这取决于它们如何实现。如果平台不允许创建互斥体,那么C++不能使它们可用。