2014-12-09 20 views
7

Kafamı C++ 'da tam olarak bir iptal etme noktasının ne olduğunu anlamaya çalışıyorum.Tam olarak bir iptal noktası nedir?

man page ve

What are pthread cancellation points used for Ama hala bazı noktalarda biraz karıştı: okudum. Örneğin, write() işlevini kullanıyorum. Görünüşe göre bu bir iptal noktasıdır. Bu yüzden write() işlevini çağırdığımda, başka bir iş parçacığının işlemeye başladığını görebiliyorum (bu yüzden kodum yazım iş parçasından başka bir iş parçacığına geçecek), bu genellikle yazma-yazma arabelleği dolduğunda ve yazmadan önce boşaltılması gerektiğinde ortaya çıkar.() başarılı olabilir/tamamlayabilir.

Ama kafamda

, bu bir dişin bir iptal değil, sadece geçici bir engelleme/askıya ve yapmak için hiçbir iplik "temizleme" ...

Yani benim soru, iptal yapmak var noktalar "engelleme noktaları" ile ilişkisi var? - onlar gerçekten aynı şey mi, yoksa bir fark var mı? Bir iptal noktasının ne olduğuna dair net bir "üst düzey" açıklama gerçekten yararlı olacaktır.

+1

genel olarak bir iptal noktası kontrol akışında herhangi bir nokta burada programlayıcıya kontrol döner. "İptal" in olası tek anlamı tekrar programlanmamaktır, bu yüzden zamanlama kararlarını etkileyebiliyorsanız bir şeyi iptal edebilirsiniz. Sistem çağrıları, programlayıcı ile doğal bir etkileşim oluşturur, ancak başkaları da olabilir. –

+0

@KerrekSB Bu yorum ve Bogdan V'nin cevabı ile, bence bu gerçekten bana mantıklı geliyor, teşekkürler :) –

+0

Zamanlayıcıya değinen net, özlü ve sağlam bir açıklama için teşekkürler @KerrekSB. – ifelsemonkey

cevap

8

parçanınİptal işlemi, istek üzerine, tamamlandığında nihai halindeki herşeyi verme özel niyetiyle (tüm kaynaklar serbest bırakılır, tüm işleyiciler güncellenir, vb.), Iplik sonlandırma anlamına gelir.

Engellemeyi ne dersiniz, iptali durumundayken bir iş parçacığı gerçekleşebilir.

Örnek: İş parçacığı bir iptal isteği alır. İş parçacığı, iş parçacığı iptal edilinceye kadar sıraya alır. İş parçacığı iptal edilebildiğinde ve iş parçacığı bir iptal noktası yürüttüğünde, iş parçacığı temizlenebilir ve iptal edilebilir. yazmak işlevinin bir iptal noktasıdır, yani bu işlev yürütülürken iş parçacığı iptal etmek için işletim sisteminin açısından güvenlidir (ilgili tüm kaynakların durumu tutarlı olacaktır).

İptal işlemi devam ederken, iş parçacığı işletim sistemi uygun göründüğü kadar engellenebilir.

Ek bir not olarak, POSIX'in iptal noktaları gereksinimine bakarsanız, hemen hemen tüm engelleme arabirimlerinin iptal noktaları olması gerekir. Aksi takdirde, tamamen engellenmiş bir iş parçacığında (bu çağrıda), bu iş parçacığını sonlandırmak için güvenli bir yol olmaz.

http://man7.org/linux/man-pages/man7/pthreads.7.html

+0

Ahh, bu daha mantıklı. Bu yüzden bir iptal noktası gerçekten ipleri iptal etmek içindir, fakat "engelleme noktaları" ile doğrudan olmayan bir ilişki vardır, çünkü dediğiniz gibi, aksi takdirde öldüremeyeceğiniz "çıkmaz" iplikler alabilirsiniz. Bence Bu benim soruma cevap ve benim karışıklığı temizler :) –

+3

Teknik olarak deadlocked iplik pthread_kill ile öldürülmüş olabilir. Hedef iş parçacığı bir SIGKILL alacak. Fakat örneğin, iş parçacığı yerel deposundaki nesnelerin yıkıcıları çağrılmayacaktır. Ayrıca, öldürüldüğünde, iplik için kullanılan iç yapıların serbest kalacağı garantisi yoktur. pthread_cancel, bir katılmadığınız zaman bunu yapmak için "en temiz" şekilde tasarlanmıştır. –

+0

Evet, iyi nokta, teşekkürler –

5

sen şu olur pthread_cancel() (c.f.) kullanarak sonlandırmak ya da (örneğin, ana iş parçacığı) Başka bir iş parçacığı bir iş parçacığı iptal etmek istediğinizde:

pthread_cancel() fonksiyon iplik evreye bir iptal isteği gönderir.

hedef iplik kerede sona olmaz, ama bir iptal noktasını (c.f.) ulaştığında oldukça zaman:

POSIX.1 belirten belirli işlevleri gerekir, ve diğer bazı fonksiyonları may İptal noktaları Bir iş parçacığı iptal edilebilirse, kabul edilebilirlik türü ertelenir ve bir iptal isteği iş parçacığı için beklemede , sonra iş parçacığı, bir iptal noktası olan bir işlevini çağırdığında iptal edilir.

da evrenin çalıştırılmasını engelleyebilir bir iptal noktası olan bu fonksiyonların olsun ya da olmasın, bu noktada alakalı değildir.

Not davranış ve ben basitlik için buraya bırakmış bir dişin "cancellability" etkileyebilir ayarlarının bulunduğunu ifade: belgelerinde bu işlevlerin bir listesi vardır. Daha fazlasını okumak için:

+0

Tüm bağlantılar için teşekkürler, bunların çoğunu okudum, sanırım karışıklık kaynağımın sebebi, “engelleme” noktasının, diğer cevapların benim için temizlediği bir iptal noktasıyla aynı olduğunu düşündüğümdür. Yine de, tüm bilgi için +1 :) –