Sample C++ code for using Intel TSX (Transactional Synchronization Extensions) on Linux.
#include <immintrin.h>
#include <iostream>
int main() {
int lockVar = 0;
if (__sync_bool_compare_and_swap(&lockVar, 0, 1)) {
// Critical section
std::cout << "Transactionally executing\n";
__sync_lock_release(&lockVar);
} else {
// Fallback path
std::cout << "Transaction aborted, using fallback path\n";
}
return 0;
}Or, using _xbegin and _xend:
#include <immintrin.h>
#include <iostream>
int main() {
int lockVar = 0;
if (_xbegin() == _XBEGIN_STARTED) {
if (lockVar != 0) {
_xabort(0xff);
}
// Critical section
std::cout << "Transactionally executing\n";
_xend();
} else {
// Fallback path
std::cout << "Transaction aborted, using fallback path\n";
}
return 0;
}Compile with:
g++ -mrtm -o tsx tsx.cFor more information, see the Intel TSX Programming Guide.