Co? Osoba se zeptala na konkrétní Linux a ekvivalent getpid(). Ne BSD nebo Apple. Odpověď je gettid() a vrací integrální typ. Budete to muset zavolat pomocí syscall() takto:
#include <sys/types.h>
#include <unistd.h>
#include <sys/syscall.h>
....
pid_t x = syscall(__NR_gettid);
I když to nemusí být přenosné na jiné než linuxové systémy, ID vlákna je přímo srovnatelné a velmi rychle se získává. Lze jej vytisknout (například pro LOG) jako normální celé číslo.
Jak je uvedeno v jiných odpovědích, pthreads nedefinuje na platformě nezávislý způsob, jak získat integrované ID vlákna.
V systémech Linux můžete získat ID vlákna takto:
#include <sys/types.h>
pid_t tid = gettid();
Na mnoha platformách založených na BSD poskytuje tato odpověď https://stackoverflow.com/a/21206357/316487 nepřenosný způsob.
Pokud si však myslíte, že potřebujete ID vlákna, je vědět, zda běžíte na stejném nebo jiném vlákně než na jiném vlákně, které ovládáte, můžete v tomto přístupu najít nějakou pomůcku
static pthread_t threadA;
// On thread A...
threadA = pthread_self();
// On thread B...
pthread_t threadB = pthread_self();
if (pthread_equal(threadA, threadB)) printf("Thread B is same as thread A.\n");
else printf("Thread B is NOT same as thread A.\n");
Pokud jen potřebujete vědět, zda jste v hlavním vláknu, existují další způsoby, zdokumentované v odpovědích na tuto otázku, jak mohu zjistit, zda je pthread_self hlavním (prvním) vláknem v procesu?.
pid_t tid = syscall(SYS_gettid);
Linux poskytuje takové systémové volání, které vám umožní získat ID vlákna.
pthread_self()
funkce poskytne ID vlákna aktuálního vlákna.
pthread_t pthread_self(void);
pthread_self()
funkce vrací popisovač Pthread volajícího vlákna. Funkce pthread_self() NEVRÁTÍ integrální vlákno volajícího vlákna. Musíte použít pthread_getthreadid_np()
vrátit integrální identifikátor vlákna.
POZNÁMKA:
pthread_id_np_t tid;
tid = pthread_getthreadid_np();
je výrazně rychlejší než tato volání, ale poskytuje stejné chování.
pthread_id_np_t tid;
pthread_t self;
self = pthread_self();
pthread_getunique_np(&self, &tid);