Bir std::threadve daha sonra başlattığımı varsayalım detach(), böylece bir std::threadkez 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_taskya 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::exitveya çıkıştan önce sonlandırmakmainbu 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)