Почему эти транзакции 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".