Bu konum platforma bağlı olarak tür yapılabilir, ama kesinlikle hiçbir taşınabilir ve jenerik bir şekilde ...
Mac OS X doğrudan belgelenmiş bir yaklaşımla tek gibi görünüyor, bunların pthread.h dosyaya göre:
/* returns non-zero if the current thread is the main thread */
int pthread_main_np(void);
Ayrıca FreeBSD pthread_main_np() tanımlayan bir pthread_np.h başlığa sahiptir, bu nedenle bu (en azından 8.1) çok FreeBSD çalışması gerektiği bulunmuştur ve OpenBSD (4.8 en azından) pthread.main'de de pthread_main_np() var. _np'nin taşınabilir olmayan bir şekilde açık olduğunu unutmayın! eğer eşleşirse Aksi
, zihin geçerli iş parçacığının TID için sürecin PID karşılaştırıyor gelince sadece daha "genel" bir yaklaşım, bu iş parçacığı ana olduğunu. Bu, tüm platformlarda zorunlu olarak çalışmaz, bir TID'yi gerçekten elde edip edemeyeceğinize bağlıdır (örneğin OpenBSD'de yapamazsınız) ve eğer varsa, PID ile herhangi bir ilişkisi varsa veya threading alt sistemi, mutlaka ilişkili olmayan kendi hesabına sahiptir.
Ayrıca bazı platformların ana iş parçacığı için TID olarak sabit değerler verdiklerini de öğrendim, böylece bunları denetleyebilirsiniz.
ben kontrol ettim platformların kısa bir özeti:
- Linux: burada mümkün sistem çağrı (SYS_gettid) == getpid() Eğer
- FreeBSD istediğim şey: Mümkün değil burada, thr_self
- OpenBSD)() rastgele görünüyor ve ilişkisi olmadan (getpid için: mümkün değil burada, bir TID
- NetBSD almak için bir yolu yoktur: buradamümkün, _lwp_self() her zaman m için 1 değerini döndürür ain iplik
- Solaris: Burada mümkün , pthread_self() her zaman Yani temelde Mac OS X, FreeBSD ve OpenBSD üzerinde doğrudan yapmak mümkün olmalıdır ana iş parçacığı
için 1 değerini döndürür.
Linux'ta TID == PID yaklaşımını kullanabilirsiniz.
NetBSD ve Solaris'te TID == 1 yaklaşımını kullanabilirsiniz.
Umarım bu yardımcı olur, iyi günler dilerim!
Diğer insan tarafından okunabilir adlar nasıl elde edilir? – Potatoswatter
Daha spesifik olarak, "ana" nin uyum sağlamadığı model nedir? – Potatoswatter
Sistemdeki iş parçacıklarının çoğu yalnızca birkaç yolla başlatıldı. Orada bir sanal std :: string name() işlevine güvenebilecek ortak kod var. Ana iş parçacığı farklı olsa da. –