Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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
Assembly 互斥体的定义_Assembly_X86_Locking_Mutex - Fatal编程技术网

Assembly 互斥体的定义

Assembly 互斥体的定义,assembly,x86,locking,mutex,Assembly,X86,Locking,Mutex,想看看x86汇编程序中互斥的外观。最初编写了一个C++应用程序,使用C++ 11:< /p> #include <mutex> int main(){ std::mutex m; volatile int i = 0; m.lock(); i = 6; m.unlock(); return 0; } #包括 int main(){ std::互斥m; 挥发性int i=0; m、 锁(); i=6; m、 解锁(); 返回0;

想看看x86汇编程序中互斥的外观。最初编写了一个C++应用程序,使用C++ 11:< /p>
#include <mutex>

int main(){
    std::mutex m;
    volatile int i = 0;

    m.lock();
    i = 6;
    m.unlock();

    return 0;
}
#包括
int main(){
std::互斥m;
挥发性int i=0;
m、 锁();
i=6;
m、 解锁();
返回0;
}
但是当我检查程序集输出文件时,有1000多行asm,我看不到任何原子指令或
LOCK
指令

接下来,我发现这个网站展示了如何在x86中编写互斥体:


我在白皮书中看到过其他x86互斥实现,它们看起来要复杂得多(有些使用CMPXCHG),所以我想知道下面的代码是否包含任何隐藏的竞争条件或问题?代码似乎太简单了。

这是一个中断的实现,因为如果互斥锁已经锁定,就不会有任何等待


关于一些简单的实现,请参见这个问题:

因此,除非我弄错了,否则它在lock()中的XCHG后面缺少一个BNE,如果它们不相等,请跳回到开始并重新执行XCHG?(这是否被归类为“等待”,因为它会一次又一次地这样做,直到成功?)对于最小的实现—是的。另外,我在
变量中看不到任何意义,因此在两个
mov
指令中,您看到链接了吗?我认为值是在main()中使用的?它对实际应用程序没有用处,因为它是全局的,不受互斥锁的保护。保护来自互斥锁使用前后的锁定(在链接中),当然在内存操作数上使用时?
xchg
具有隐式锁定前缀。