2016-03-18 15 views
0

Şimdi iş parçacığı güvenli bir şekilde sonlandırmak istediğiniz bir çok iş parçacıklı C++ 03 uygulaması (Linux tabanlı) var.C++ 03'teki bir programdan, iş parçacığı güvenli bir şekilde nasıl çıkılır?

exit(0) kullanmayı denedim, ancak bu işlem başka bir iş parçacığı tarafından aktif olarak kullanılan bazı statik değişkenleri yok ederek, bu iş parçacığının serbest belleğe ve yok edilen nesnelere erişmesine neden olarak bir çekirdek dökümü oluşturuyor! Görünüşe göre, exit() işlevinin bir veri yarışı vardır: "Bu işlevin çağrılması, statik süre olan tüm nesneleri yok eder: Birden çok iş parçacığı çalıştıran bir program, çıkış çağırmaz (statik nesneleri etkilemeyen benzer bir işlev için quick_exit dosyasına bakın)."

C++ 11 bir iş parçacığı güvenliği quick_exit() işlevi sunar. Ama bu büyük uygulamayı şu anda C++ 11'e taşıyabilme yeteneğine sahip değilim.

Ayrıca, temiz sonlandırma/iş parçacıklarının birleştirilmesi için çaba harcamak istemiyorum. Bu çok karmaşık bir programdır ve önemli miktarda iş gerektirecektir.

Başka alternatifler var mı? Programın hemen çıkmasını istiyorum, temizlik yok, çekirdek dökümü yok.

Düzenleme: Gerçekten yapmaya çalıştığım şey, abort() çağrılarını, bir kopyalamaya neden olmayacak bir şeyle değiştirmektir. Ve abort() iş parçacığı güvenlidir, btw.

+2

Başka bir deyişle: Bir kısayol (düzgün kapatma mantığı yok) aldınız ve şimdi pişman oluyorsunuz. – BitTickler

+1

Belki 'kill (getpid(), SIGKILL); '? :) –

+1

Yan not: Pek çoğu kapatma kodunu yazmamaktan hoşlanıyor. Zamanlarını kurtardığını düşünüyorlar. Ama ... o zaman nasıl programda valgrind gibi araçları kullanıyorsun? – BitTickler

cevap

0

. Bir işlemi sonlandırmak ve denetimi işletim sistemine döndürmek genellikle güvenlidir, ancak "kaba kuvvet" ile bir iş parçacığını sonlandırmak genellikle kötü bir fikirdir. Nedeni çok sayıda kod ve kütüphane, tek bir dişli ortamda çalıştığı varsayımıyla yazılmıştır. Bir iş parçacığının öldürülmesi, bazı global değişkenleri "kuantum durumunda" bırakacak ve bu da diğer iş parçacıklarında çalışan kod için sorunlara neden olacaktır. Söz konusu kodda bir yer bulmak için çaba harcamanız ve kibarca "sor" çıkması daha iyidir.

+0

İşlemden çıkmak istiyorum, iş parçacığı değil. Netlik eksikliği için üzgünüm. – jfritz42

İlgili konular