Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++;使用内联汇编的代码?_C++_Mutex_Inline Assembly - Fatal编程技术网

C++ 如何模拟以下c++;使用内联汇编的代码?

C++ 如何模拟以下c++;使用内联汇编的代码?,c++,mutex,inline-assembly,C++,Mutex,Inline Assembly,我尝试使用原子内联汇编代码模拟以下代码: struct Node{ Node * next; int value; } typedef struct Node * Node_ptr; Node_ptr store(Node_ptr ** L, Node_ptr * I){ pthread_mutex_lock (&queue_mutex); Node_ptr tmp = **L; **L = *I; pthread_mutex_unl

我尝试使用原子内联汇编代码模拟以下代码:

struct Node{
    Node * next;
    int value;
}

typedef struct Node * Node_ptr;

Node_ptr store(Node_ptr ** L, Node_ptr * I){
    pthread_mutex_lock (&queue_mutex);
    Node_ptr tmp = **L; 
    **L = *I;
    pthread_mutex_unlock (&queue_mutex)
    return tmp;
}
以下是我尝试过的:

Node_ptr tmp;
__asm volatile ("lock; movq %1, %%rax; movq %%rax, %0"
                    : "=r" (tmp)
                    : "r" (**L)
                    : "%rax"
                    );

__asm volatile ("lock; movq %1, %%rax; movq %%rax, %0"
                    : "=r" (**L)
                    : "r" (*I)
                    : "%rax"
                    );
return tmp;
然而,我得到了一个“非法指令”错误,我很难看到我哪里出错了。有没有人对这个问题有所了解

谢谢


编辑:添加了node_ptr的定义。英特尔手册在
LOCK
前缀的主题上说明了以下内容:

锁定前缀只能在以下说明的前面 而且只适用于目的地 操作数是内存操作数:ADD、ADC和、BTC、BTR、BTS、CMPXCHG、, CMPXCH8B、DEC、INC、NEG、NOT或SBB、SUB、XOR、XADD和XCHG。如果 锁定前缀与这些指令之一和源一起使用 操作数是内存操作数,可能存在未定义的操作码异常(#UD) 将生成。如果发生以下情况,还将生成未定义的操作码异常: 锁定前缀与上面列表中未列出的任何说明一起使用


这里最好做的事情(除了阅读英特尔几千页厚手册),就是看编译器为C++代码生成什么样的输出,这应该给你一个想法。

< P>英特尔的手册中说下面的关于“代码”主题的锁前缀:

锁定前缀只能在以下说明的前面 而且只适用于目的地 操作数是内存操作数:ADD、ADC和、BTC、BTR、BTS、CMPXCHG、, CMPXCH8B、DEC、INC、NEG、NOT或SBB、SUB、XOR、XADD和XCHG。如果 锁定前缀与这些指令之一和源一起使用 操作数是内存操作数,可能存在未定义的操作码异常(#UD) 将生成。如果发生以下情况,还将生成未定义的操作码异常: 锁定前缀与上面列表中未列出的任何说明一起使用


这里最好做的事情(除了阅读英特尔几千页厚手册),就是看编译器为C++代码生成什么样的输出,这应该给你一个想法。

< P>你所寻找的是CMPXCHG指令。(您仍然需要
LOCK
前缀。)

您要查找的是
CMPXCHG
指令。(您仍然需要
LOCK
前缀。)

只允许在一些指令中使用
LOCK
前缀<代码> MOV 可能不是其中之一。这个例子看起来像C,而不是C++代码,如果我们知道NoDEY-PTR定义为什么,它会有帮助。我想你想使用锁XCHG,但是这取决于NoDEY-PTR是什么。看看使用gcc原子内部函数是否有更好的帮助:只允许在一些指令上使用
前缀<代码> MOV 可能不是其中之一。这个例子看起来像C,而不是C++代码,如果我们知道NoDEY-PTR定义为什么,它会有帮助。我想你想使用锁XCHG,但是这取决于NoDEY-PTR是什么。看看使用gcc原子内部函数是否有更好的帮助:编译器只需生成一个
调用pthread\u mutext\u lock
。他感兴趣的(我想)是在这个函数中发生了什么;除非存在争用,否则它不会调用操作系统。@James说得很对,但没有什么能阻止你仅仅使用调试器并进入其中。。那么,您可能需要使用KDB来获得真正有趣的东西。编译器只需生成一个调用pthread\u mutex\u lock的
。他感兴趣的(我想)是在这个函数中发生了什么;除非存在争用,否则它不会调用操作系统。@James说得很对,但没有什么能阻止你仅仅使用调试器并进入其中。。你可能需要使用KDB来获取真正有趣的东西。