Это довольно выполнимо, в зависимости от платформы, на которой вы работаете, но абсолютно никак не переносимым и универсальным способом ...
Кажется, что Mac OS X - единственный с прямым и документированным подходомв соответствии с их pthread.h файлом:
/* returns non-zero if the current thread is the main thread */
int pthread_main_np(void);
Я также обнаружил, что FreeBSD имеет заголовок pthread_np.h, который определяет pthread_main_np (), так что это должно работать и во FreeBSD (8.1как минимум), а в OpenBSD (как минимум 4.8) pthread_main_np () также определена в pthread.h.Обратите внимание, что _np явно означает непереносимый!
В противном случае единственный более общий подход, который приходит на ум, - это сравнение PID процесса с TID текущего потока, если они совпадают, этого потокаэто главное.Это не обязательно работает на всех платформах, это зависит от того, можете ли вы вообще получить TID (вы не можете, например, в OpenBSD), и если вы это сделаете, имеет ли он какое-либо отношение к PID или еслиПодсистема потоков имеет свой собственный учет, который не обязательно связан.
Я также обнаружил, что некоторые платформы возвращают постоянные значения в виде TID для основного потока, поэтому вы можете просто проверить их.
Краткое описание платформ, которые я проверил:
- Linux: возможно здесь , syscall (SYS_gettid) == getpid () - это то, что вам нужно
- FreeBSD: здесь невозможно, thr_self () кажется случайным и не имеет отношения к getpid ()
- OpenBSD: здесь невозможно, нет способа получить TID
- NetBSD: возможно здесь, _lwp_self () всегда возвращает 1 для основного потока
- Solaris: возможно здесь , pthread_self () всегда возвращает 1 для основного потока
Таким образом, в основном вы должны быть в состоянии сделать это непосредственно наMac OS X, FreeBSD и OpenBSD.
Вы можете использовать подход TID == PID в Linux.
Вы можете использовать подход TID == 1 в NetBSD и Solaris.
Надеюсь, это поможет, хорошего дня!