Thread seçimi
NThread tek bir hedef thread'i yakalar ve yaşam döngüsü boyunca onu sürer. Bu nedenle thread seçimi yalnızca performans tercihi değildir;...
NThread tek bir hedef thread'i yakalar ve yaşam döngüsü boyunca onu sürer. Bu nedenle thread seçimi yalnızca performans tercihi değildir; kararlılık ve hedef uygulamanın davranışı için temel bir karardır.
Erişim oluşturma seçenekleri
createAccessor üç kimlik biçimini destekler:
idType | id anlamı | Davranış |
|---|---|---|
thread | Thread ID | Belirtilen tek thread kullanılır. |
process | Process ID | Süreçten bir thread seçilir. |
processAllThreadIds | Process ID | Tüm aday thread'ler başlatılmaya çalışılır; ilk başarıyla park edilen kazanır. Varsayılandır. |
processAllThreadIds, adayları NThreadRaceAccessor ile yarışa sokar. Kazananın dışındaki adaylar abort edilir; accessor zincirinin tamamı ise her aday için ayrı ayrı değil, yalnızca bir kez kurulur. Bu, “thread bulma” aşamasında dayanıklılık sağlar, fakat hangi thread'in kazandığını görünür kılmayı daha da önemli yapar.
Hangi thread'lerden kaçınılmalı?
- UI mesaj döngüsünü çalıştıran thread'ler: kısa bir park bile kullanıcı arayüzünü dondurabilir.
- Loader veya başlangıç thread'leri: loader lock tutuluyor olabilir.
- Uzun süre mutex/critical section tutan worker thread'ler.
- Kapanmak üzere olan veya sıkça
ExitThreadçağıran thread'ler. - Hook'un bellek accessor'ını sürmekte olan thread: NHook, suspend sayacı çakışmasın diye bunu ayrıca askıya almaz.
Pratik yaklaşım
Önce processAllThreadIds ile kontrollü bir test sürecinde çalışan bir aday bulun. Sonra loglanan kazanan thread ID'siyle davranışı gözlemleyin. Hedefin thread modeli biliniyorsa, üretim benzeri deneylerde idType: 'thread' ile bilinçli bir thread seçmek daha açıklanabilir sonuç verir.
Thread seçimi her çağrıda değişmez: NThread başlatıldıktan sonra aynı thread park edilir ve çağrılar bunun üzerinden yürür. Thread ölürse accessor'ı sağlıklı kabul etmeyin; yeni bir accessor oluşturun.
NThread çağrı yaşam döngüsü
Bir NThread, ömrü boyunca tam olarak bir OS thread'ini yönlendirir. Varsayılan factory yolunda hangi thread'in seçileceği init() sırasında...
Çökme ve hata ayıklama
Süreçler arası context ve stack düzenleme hataları çoğu zaman host'ta değil, hedef süreçte erişim ihlali olarak görünür. Aşağıdaki liste, NThread...