std::thread
doğrudan veya dolaylı olarak kullanan bir program derlerken -std=c++11
belirtiliyor -pthread
? Kaputun altındaki pthreads kullanarak std::thread
uygulama detayının programcıya maruz kalması garip görünüyor; Kullanıcıya posix uyumlu iş parçacığı kitaplığı seçeneği sunuluyorsa, neden varsayılan olarak pthreads ve varsayılan olarak bunu geçersiz kılmak için --threading-model=<your_favorite_posix_threads_library>
argümanımız var?Neden GCC ve Clang'da std :: thread kullanımı için -pthread gerekli?
cevap
-pthread
seçeneği, evrensel olarak std::thread
'u kullanmak için gerekli değildir - bu, üzerinde kurulu olduğunuz platformun bir uygulama alıştırmasıdır.
Derleme:
#include <thread>
#include <iostream>
int main()
{
std::thread t{[]()
{
std::cout << "Hello World\n";
}};
t.join();
return 0;
}
clang -std=c++11 ThreadTest.cpp -lc++
MacOSX üzerinde olan, oluşur ve çalışır ve biz yaparsak:
otool -L a.out
a.out:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1225.0.0)
Biz bağlamak için gerekli ettik görebilirsiniz Bu işi yapmak için fazladan bir şey - ya da sahnelerin arkasında gerçekleşmedi. Pthreads'ın ayrı bir kütüphane olduğu bir platform uygulama detayı gibi görünüyor.
Pthread arabirimiyle birlikte bir dizi kütüphaneye sahip olmak, * NIX sistemlerinde, birçoğu iplik desteği olmadan çalışmaya başlayan eski bagajıdır, daha sonra tam çekirdek desteğine sahip olmadan önce kullanıcı alanı iş parçacıkları aşamasından geçmiştir. Sanırım hala var çünkü kimsenin değişmeyi istememesi.
"Sanırım hala var çünkü hiç kimseyi değiştirmek zorunda kalmazsınız" ama kodu değiştirmek zorunda kalıyorsunuz çünkü std :: thread kullanmaktan başka bir şey belirtilmemişse lpthread'i nasıl tanımlayacağımı anlamıyorum. bir şeyleri kırar mı? – Voo
Sözünü ettiğim değişiklik, bazı platformlarda iş parçacığı kullanan herhangi bir programda libpthread'in yer alması gerektiğiydi. C++ 11 uyumlu araçlar ve kütüphaneler, C++ 03 kod tabanlarına çok büyük ölçüde geriye dönük olarak uyumludur. Birincisi, pthreads'ın neden ayrı bir kütüphanede yer aldığını merak etmelidir. – marko
Peki bu ilginç. Clang ile inşa edip '-lC++' yi belirtmezseniz, meraktan kaçının, OSX'te C++ kütüphanesi ne kullanılır? – JAB
- 1. Neden std :: thread ile otomatik kullanamıyorum?
- 2. std :: unique_ptr parametresi olarak std :: thread
- 3. std :: thread nasıl sonlandırılır?
- 4. std :: thread - parçanizin isimlendirilmesi
- 5. std :: this_thread * işlevlerini boost :: thread?
- 6. Std :: thread nasıl bir standarttır?
- 7. Kendisini ayırmak ve sonlandırmak için bir std :: thread alın
- 8. Neden gerekli program için çıktı almıyorum?
- 9. C++ 11: GCC 4.8 static thread_local std :: unique_ptr tanımsız başvuru
- 10. Neden bir yeterlilik gerekli değil?
- 11. gerekli INITCOMMONCONTROLSEX() ve InitCommonControls() kullanımı kolay mı?
- 12. pthread (segmentasyon hatası)
- 13. std :: thread :: id. Gereksinimleri. Atomize olabilir mi?
- 14. std :: this_thread :: getiri() kullanımı?
- 15. Hangi sözdizimi şudur: std :: thread t ([&]() {...}) ;?
- 16. GCC
- 17. Neden ikinci bir cin.ignore() gerekli?
- 18. Std :: thread :: id varsayılan yapıcısı değil "NULL" kimliği oluşturmalı mı?
- 19. pthread library undefined reference
- 20. Bir std :: thread tanımlamak ve daha sonra başlatmak mümkün mü?
- 21. hatası: gcc ile silinen fonksiyon bool regex_match kullanımı 5.2.0
- 22. Pthread Loop'ta Segmentasyon Hatası
- 23. GCC 4.8 std :: string yapıcısı için kötü kod üretir?
- 24. Pthread: İnsanlar neden pthread_exit kullanarak rahatsız ediyor?
- 25. C++ 'da std bind kullanımı argümanlı (string) işlevler için
- 26. std :: async neden yapısını ve argümanlarını kopyalar?
- 27. Neden Thread yerine Runnable kullanmalıyım?
- 28. Glibc ve pthread kütüphaneleri neden aynı API'ları tanımladı?
- 29. boost :: call_traits - Neden gcc bunun için yanlış mı veriyor?
- 30. Neden clang gcc kurulumunu seçer?
"G ++ for C++" yi "g ++ -pthread -std = C++ 11" olarak düşünürseniz ve bu tanımdaki sözcük gürültüsü hakkında endişelenmiyorsanız size yardımcı olur mu? –
@KerrekSB CMake'i kullanırken ve CMAKE_CXX_FLAGS'ın (Microsoft'un derleyicisi bilinmeyen bayraklardan şikayetçi olmakla birlikte bunları yok sayar) veya platform/'find_library 'koşullu koşullarını koymadan açıkça bir çapraz bağlantıya başvurmadan çapraz platform olmaya çalışmayı zorlaştırıyor. _does_ davranışı sonunda değişiyor. Ben bulduğum bir posta listesi 'find_package (Threads)' kullanarak önerdi, ancak bu GCC veya Clang ile çalışmıyor gibi görünüyor. Ne yapacağımı bildiğimden bir çözüm aramıyorum, sadece neden böyle davrandıklarını bulmaya çalışıyorum. Bu sadece geriye doğru mu? – JAB
Bunun bir sebebi olduğunu düşünmüyorum. Pre-C++ 11 derleyicisinden miras alınan davranışı değiştirmek için kimse çok fazla umursamadı. – SergeyA