Получить ID потока в переменную

133
15 января 2020, 10:30

Как извлечь ID потока из pthread_self() в целочисленную переменную? То есть что-то типа такого:

int a=pthread_self();

Или если этого сделать нельзя, то как вывести на экран ID потока при помощи cout. В стиле C это получается:

printf("thread id = %d\n", pthread_self());

а строка

cout<<pthread_self();

даёт ошибку

Answer 1

Тип ID потока свободен и может быть исполнен в любом исполнении разными компиляторами. Можно нарисовать как список байтов так :

// g++ -Wall -Wpedantic showthrid.cpp
# include <iostream>
typedef
union {
  volatile pthread_t tid;
  volatile uint8_t bid [sizeof(pthread_t)];
  }
uid ;
int main(){
    uid u ;
    u.tid = pthread_self();
    std::cout<<"pthread_self = "<<std::hex;
    for(int i=sizeof(pthread_t);i;){
        -- i ;
        std::cout<<((unsigned int )u.bid[i])<<".";
        }
    std::cout<<std::endl;
    std::cout<<" = "<<((size_t)u.tid)<<std::endl; }
$ ./a.out 
pthread_self = 0.0.7f.3b.21.d0.4d.80.
 = 7f3b21d04d80

И если вы найдёте численный тип с нужным размером, то на этот тип и кидайте значение. У меня размер 8 байт. То есть можно впихнуть в size_t.

Answer 2

pthread_self возвращает дескриптор потока, не особо пригодный для печати и чтения. Получить числовой идентификатор потока можно так:

#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <unistd.h>
#include <sys/syscall.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
    long id;
    errno = 0;
    id = syscall(SYS_gettid);
    if(0 != errno)
    {
        perror("syscall(SYS_gettid) failed");
        abort();
    }
    fprintf(stdout, "thread id %li", id);
    return 0;
}
READ ALSO
Как изменить тему в других activity?

Как изменить тему в других activity?

Я новичок и прошу помощиЕсть ThemesActivity в котором прописано динамическое изменение темы при выборе одного из radiobutton

178
(Java) Значение, проверяемое if, истинно, но срабатывает else

(Java) Значение, проверяемое if, истинно, но срабатывает else

Недавно начал учить Java, изучал if, решил вот такое написатьПри вводе правильного username и password, которые соответствуют adminUsername и adminPassword, всё-равно...

148
Не знаю, какие классы использовать для создания анимации на SurfaceView в потоке Surface Holder

Не знаю, какие классы использовать для создания анимации на SurfaceView в потоке Surface Holder

Есть массив элементов: у каждого есть координаты, bitmap и список анимаций (поворот, перемещение), который элемент должен выполнитьВсе в потоке...

146
SimpleDateFormatter Android Studio

SimpleDateFormatter Android Studio

пытаюсь спарсить дату вида "2510

146