C ++ 11 имеет возможность получить текущий идентификатор потока, но он не является фиксируемым к целому типу:
cout<<std::this_thread::get_id()<<endl;
Вывод: 139918771783456
cout<<(uint64_t)std::this_thread::get_id()<<endl;
ошибка : Неверный отказ от типа STD :: Thread :: ID 'для типа' uint64_t ' То же самое для других видов: Неверный отлив от типа STD :: Thread :: ID 'для типа' uint32_t '
Я действительно не хочу делать литье указателя, чтобы получить целочисленный идентификатор поток. Есть ли какой-то разумный путь (стандартный, потому что я хочу, чтобы это было портативным), чтобы сделать это?
Другая альтернатива:
#include <atomic>
static std::atomic<unsigned long long> thread_counter;
unsigned long long thread_id() {
thread_local unsigned long long tid = thread_counter++;
return tid;
}
сгенерированный код для этой функции g ++ в 64-разрядном x86 справедлив:
_Z9thread_idv:
cmp BYTE PTR fs:_ZGVZ9thread_idvE3tid@tpoff, 0
je .L2
mov rax, QWORD PTR fs:_ZZ9thread_idvE3tid@tpoff
ret
.L2:
mov eax, 1
lock xadd QWORD PTR _ZL14thread_counter[rip], rax
mov BYTE PTR fs:_ZGVZ9thread_idvE3tid@tpoff, 1
mov QWORD PTR fs:_ZZ9thread_idvE3tid@tpoff, rax
ret
_ZGVZ9thread_idvE3tid:
.zero 8
_ZZ9thread_idvE3tid:
.zero 8
Т.е. единственное ответвление без любой синхронизации, которая будет правильно предсказана за исключением первого раза, Вы вызываете функцию. После этого просто единственный доступ к памяти без синхронизации.