2015-04-17 24 views
8

tamam boost::thread ve std::thread gelen karıştırmak ve maç şeyler mi, yoksa fonksiyonların bir set her biri için kullanılmalıdır? Benim kod boost::thread s kullandığı içinstd :: this_thread * işlevlerini boost :: thread?

sormak, ama geri sistem saatini ayarlarken boost::this_thread::sleep_for düzgün davranırlar olmadığını bulduk ama std::this_thread::sleep_for yapar, bu yüzden benim uyku işlev çağrısı değiştirmek ve değişen önlemek istiyorum Tüm boost::thread s eğer mümkünse std::thread s.

+3

açıkça tanımlanmamış verecektir onları Karıştırma davranışı. Standart kitaplığınız Boost's gibi bir kod kullanacaksa işe yarayabilir, ancak olasılıkları oldukça düşük olarak değerlendiririm (eğer bize hangi derleyici/kütüphane olduğunu söylemediğinizde eğitimli bir tahminde bulunmak bile imkânsızdır)) kullanılarak. –

+0

Sadece bir fyi, 1.58 desteği, bahsettiğiniz uyku hatasını düzeltir (bugün serbest bırakılır) –

cevap

1

sen/IFF şeyler kaçabilirsiniz.

Ancak, değişmezleri kırma olacaktır. Basit bir örnek: Boost Konudaki en kesinti noktaları (std::this_thread::sleep_* dahil) olmayan boost senkronizasyon ilkel ile çalışmayacaktır. Eğer Tabii

¹ süprizler içine çalışan riskini göze diye kütüphaneler örneğin onlar içten konuları kullanın (tamamen ayrı endişeleriniz varsa

Bu yüzden ", aslında ilgili konuları kontrol etmek için kütüphaneleri karıştırma karşı Avice ediyorum kara kutuda "), bu kütüphaneleri tek bir süreçte birleştiren bir sorun olmamalıdır.


Ben kilitlenmeleri oluyor görebilirsiniz ¹ ve veri yarışları/sızıntıları hayal büyük bir streç gerektirmez (iplik düşünmek yerel veri desteği/call_once/ set_value_at_thread_exit ...)

1

bir iş parçacığı içinde API'leri karıştırmak için önerilmez. @Jerry Coffin'in belirttiği gibi, tanımlanmamış davranışlara da girebilirsiniz. Bu API'ların, farklı bir API tarafından oluşturulan thread'larla uyumlu olmayacağına dair iş parçacığı yerel durumu olabilir. Bununla birlikte, bir işlemde std::thread ve boost::thread'un kullanılması ayrı ayrı yapılmalıdır. @Red Alert, 1.58'in hatayı çözdüğünü söylediğinden, bu problemi çözmelidir. Aksi takdirde, geçici olarak farklı platformlar için #ifdef s usleep() ve benzeri işlevlere geri dönebilirsiniz. uygulamaları aynı uygulamaları (linux üzerinde örneğin pthread) kullandığından Uygulamada

+0

Sanırım, “uyuyalım” kütüphane değişmezlerini kırmaya devam edecektir; Bunun tersi, bunu daha açık hale getirecektir. Örneğin. birkaç kişi, 'usleep' ile sihirli bir şekilde çalışmak için kesinti noktaları bekler – sehe

İlgili konular