2011-02-01 10 views
7

arkaplan: Birçok programlar tarafından kullanılan bir günlük kütüphaneye üzerinde çalışıyorum. (
Ben, ana iş parçacığı "ana" almalısınız her iplik için bir okunabilir adını tahsis edeceğim ama her ana başında kod gerektirmeden kütüphaneden içinden o halini tespit edebilmek istiyorum) işlevi.nasıl pthread_self süreçte ana (ilk) iplik olup olmadığını söyleyebilir?

Ayrıca dikkat: kütüphane kodu daima ana iş parçacığı ilk girilen edilmeyecektir.

+0

Diğer insan tarafından okunabilir adlar nasıl elde edilir? – Potatoswatter

+0

Daha spesifik olarak, "ana" nin uyum sağlamadığı model nedir? – Potatoswatter

+0

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. –

cevap

11

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!

+1

MacOSX güçlü köklere sahip * BSD türünün pthread_main_np() işlevinin nereden geldiğini açıklar. Tüm * BSD'lerde de tamamen belgelenmiş bir arayüz (bir manpage var). Solaris, 'thr_main()' ile eşdeğerdir ve basitçe burada # pdread_main_np thr_main' komutunu kullanabilirsiniz. Bunu TID == 1’den daha iyi kullanın. –

+1

Bu büyük olasılıkla söylemeye gerek yok, ancak iOS için de yazmayı planlıyorsanız, pthread_main_np() işlevi de destekleniyor. – NSDestr0yer

7

Çağrı pthread_self() ana den() ve sonucu kaydedin. Ana iş parçacığı olup olmadığını öğrenmek için gelecekteki çağrıları pthread_self() ile depolanan değerinize karşılaştırın.

+1

Bu kitaplığın MANY programları tarafından kullanıldığını açıklığa kavuşturmak için sorumu düzenledim. Her birine yeni kod eklemek istenmeyen bir durumdur. –

0

Bir isim (isme iplik id belki bir harita) kayıt yumurtlamaya konuları verir paylaşılan adı kaynağın çeşit yararlanabilirler. Günlüğe kaydetme sisteminiz daha sonra bir iş parçacığı ile iş parçacığı kimliğini kullanarak bir iş parçacığı güvenli bir şekilde yerleştirebilirsiniz. İplik öldüğünde

, bunun bellek sızıntısı önlemek için haritalama gelen isim kaldırmak var.

Bu yöntem sadece ana değil, bütün ipler adlandırılacak izin vermelidir.

+0

Zaten bunlara sahibim. Bu, hangi iş parçacığının ana olduğunu otomatik olarak belirlemede yardımcı olmaz. –

İlgili konular