GNU/Linux >> Znalost Linux >  >> Linux

Jak získat ID vlákna pthread v programu linux c?

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);

Linux
  1. Jak ukončit vlákno v programu C ( příklad pthread_exit )

  2. Jak vytvářet vlákna v Linuxu (pomocí ukázkového programu C)

  3. Jak pojmenovat vlákno v Linuxu?

  1. Jak získat velikost adresáře v Linuxu

  2. Jak získat název hostitele z IP (Linux)?

  3. Jak získat masku sítě z bash?

  1. AVR - Jak naprogramovat čip AVR v Linuxu

  2. Jak zjistit, kde je program v linuxu zaseknutý?

  3. Jak získat ldapsearch na Scientific Linux?