3

rtm トランザクションを使用しようとしています。組み込み関数を使用して単純なトランザクションを実装し始めました。しかし、次の行は常にゼロを返すことがわかりましたが、トランザクションが正常に開始されるには-1である必要があります。
int status = _xbegin();
次に、if..elseをループに入れてこのコードに到達しようとしました:

#include<stdlib.h>
#include<immintrin.h>
#include<stdio.h>

void main()
{
    int status = _xbegin();
    if (status == _XBEGIN_STARTED) {
        printf("111");
        _xend();
    } else {
        printf("000");
    }
    status = _xbegin();
    if (status == _XBEGIN_STARTED) {
        printf("111");
        _xend();
    } else {
        printf("000");
    }
}


コードの出力は「000111」で、最初のトランザクションが失敗する理由が理解できませんが、2 番目のトランザクションは失敗しません。
また、最初のトランザクションで printf 入力を変更すると、2 番目のトランザクションはまったく開始されず、次の変更されたコードの出力は"0000"になります。

#include<stdlib.h>
#include<immintrin.h>
#include<stdio.h>

void main()
{
    int status = _xbegin();
    if (status == _XBEGIN_STARTED) {
        printf("111");
        _xend();
    } else {
        printf("0");
    }
    status = _xbegin();
    if (status == _XBEGIN_STARTED) {
        printf("111");
        _xend();
    } else {
        printf("000");
    }
}

printf 行の 1 つを削除しても同じことが起こります。

出力がこのようなものである理由と、問題を解決する方法を理解したいですか? immintrin.h を使用し、"gcc -mrtm" を使用してコンパイルすることに注意してください。

4

0 に答える 0