为什么一开始就等于-1? #包括 #包括 int main(int argc,字符**argv){ int x=0; while(true){ 如果(\u xbegin()!=\u xbegin\u已启动){ printf(“事务失败,正在重试”); 继续; } x++; printf(“交易完成”\n); _xend(); 打破 } 返回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的位反转,如果您将其

所以这里我没有声明“开始”,当我试图打印它的值时,它似乎是-1而不是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)