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++不能使它们可用。