为什么一开始就等于-1? #包括 #包括 int main(int argc,字符**argv){ int x=0; while(true){ 如果(\u xbegin()!=\u xbegin\u已启动){ printf(“事务失败,正在重试”); 继续; } x++; printf(“交易完成”\n); _xend(); 打破 } 返回0; }
所以这里我没有声明“开始”,当我试图打印它的值时,它似乎是-1而不是0。如果它从未被声明/定义为某物,那么认为它将是零是错误的。在这种情况下,您的编译器会痛苦地抱怨它对为什么一开始就等于-1? #包括 #包括 int main(int argc,字符**argv){ int x=0; while(true){ 如果(\u xbegin()!=\u xbegin\u已启动){ printf(“事务失败,正在重试”); 继续; } x++; printf(“交易完成”\n); _xend(); 打破 } 返回0; },c,transactions,C,Transactions,所以这里我没有声明“开始”,当我试图打印它的值时,它似乎是-1而不是0。如果它从未被声明/定义为某物,那么认为它将是零是错误的。在这种情况下,您的编译器会痛苦地抱怨它对\u XBEGIN\u start一无所知 它没有抱怨这一事实意味着有什么东西定义了它,如果打印出来时得到-1,那么可以肯定地说它被定义为该值 \u XBEGIN\u start的定义依次包含在您的文件中。所有这些都与事务性内存有关 在rtm头文件中,您可以看到\u XBEGIN\u start清楚地定义为0的位反转,如果您将其
\u XBEGIN\u start
一无所知
它没有抱怨这一事实意味着有什么东西定义了它,如果打印出来时得到-1
,那么可以肯定地说它被定义为该值
\u XBEGIN\u start
的定义依次包含在您的文件中。所有这些都与事务性内存有关
在rtm
头文件中,您可以看到\u XBEGIN\u start
清楚地定义为0
的位反转,如果您将其打印为带符号的数字(在2的补码环境中),它将为您提供-1
:
#include <stdio.h>
#include <immintrin.h>
int main(int argc, char **argv) {
int x = 0;
while(true) {
if(_xbegin() != _XBEGIN_STARTED) {
printf("Transaction failed, retrying\n");
continue;
}
x++;
printf("Transaction done\n");
_xend();
break;
}
return 0;
}
在XBEGIN指令之前,编译器将用-1加载EAX。在XBEGIN之后,它将EAX与-1进行比较。如果仍然为-1,则为事务的开始。如果不是,则事务已回滚,EAX中有一个与-1不同的事务中止代码,以便代码可以选择回滚时要执行的操作。
#define XBEGIN_STARTED (~0u)