Как получить целочисленный идентификатор нитки в C ++ 11

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 '

Я действительно не хочу делать литье указателя, чтобы получить целочисленный идентификатор поток. Есть ли какой-то разумный путь (стандартный, потому что я хочу, чтобы это было портативным), чтобы сделать это?

76
задан KARTHIKEYAN.A 3 January 2018 в 09:16
поделиться

1 ответ

Другая альтернатива:

#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

Т.е. единственное ответвление без любой синхронизации, которая будет правильно предсказана за исключением первого раза, Вы вызываете функцию. После этого просто единственный доступ к памяти без синхронизации.

1
ответ дан 24 November 2019 в 11:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: