2015-11-13 20 views
6

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?

+2

"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? –

+1

@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

+0

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

cevap

2

-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.

+0

"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

+1

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

+1

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

İlgili konular