Bir std::thread
ve daha sonra başlattığımı varsayalım detach()
, böylece bir std::thread
kez temsil ettiğinde, kapsam dışına çıksa bile, iş parçacığı yürütmeye devam eder.
Ayrıca, programın ayrılmış iplik 1'e katılmak için güvenilir bir protokole sahip olmadığını varsayalım , böylece ayrılmış iplik halamain()
çıkarken .
Ne olması gerektiğini açıklayan standartta (daha kesin olarak, N3797 C ++ 14 taslağında) hiçbir şey bulamıyorum, ne 1.10 ne de 30.3 ilgili ifadeler içeriyor.
1 Muhtemelen eşdeğer başka bir soru şudur: "koparılmış bir iş parçacığı tekrar birleştirilebilir mi?" sinyal alma işleminden hemen sonra ipliği, alıcı ucun ipliğin gerçekten bittiğini güvenilir bir şekilde tespit etmesinin bir yolu olmadan bir saat uyku moduna geçirmeye karar verin.
Bitmek ise main()
müstakil olarak çalışan iş parçacığı ile tanımsız davranıştır, o zaman herhangi kullanılması std::thread::detach()
ana iş parçacığı çıkar asla sürece tanımsız davranıştır 2 .
Bu nedenle, main()
koparılmış iş parçacıkları ile bitmek koşmanın tanımlanmış etkileri olmalıdır . Soru şu: nereye (içinde C ++ standart , POSIX, değil OS docs, ...) tanımlanan etkileridir.
2 Ayrılmış bir iplik birleştirilemez (anlamında std::thread::join()
). Sen olabilir (örn üzerinden bir gelecek müstakil parçacığı sonuçlarını beklemek std::packaged_task
ya da bir sayma semafor veya bayrak ve bir koşul değişkeni ile), ancak o değil garanti yapar iplik çalışmayı tamamlandığında . Eğer dişin ilk otomatik nesneyi yıkıcı içine sinyal parçası koymak sürece Nitekim, orada olacak , genel olarak, bu çalışma kodu (yıkıcılar) olmak sonra sinyalizasyon kodu. İşletim sistemi ana iş parçacığı sonucu tüketecek ve ayrılan iş parçacığı adı geçen yıkıcıları çalıştırmadan önce çıkacak şekilde zamanlarsa, ^ Wis ne olacağını tanımlar?
std::exit
veya çıkıştan önce sonlandırmakmain
bu gereksinimleri karşılamak için yeterlidir, ancak gerekli değildir." (paragrafın tamamı alakalı olabilir) Ayrıca bkz. [support.start.term] / 8 ( döndürüldüğündestd::exit
çağrılırmain
)