Почему эти транзакции RTM действуют странно?

Я пытаюсь работать с транзакциями 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", и я не могу понять, почему первая транзакция завершается неудачно, а вторая - нет.
Кроме того, если я внесу изменения во входные данные printf в первой транзакции, вторая транзакция вообще не запустится, и вывод следующего измененного кода будет "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.

Я хочу понять, почему выходы так и как решить проблему? Обратите внимание, что я использую immintrin.h и компилирую, используя "gcc -mrtm".

0 ответов

Другие вопросы по тегам