8

Bir noktada, main() öğesinin ilk satırı olana kadar güvenli bir şekilde oluşturulamayan konuların okunmasını hatırlıyorum çünkü derleyiciler statik başlatma süresi boyunca çalışan iş parçacığı oluşturmak için özel kodlar ekliyorlar. Bu yüzden, inşasında bir iş parçacığı oluşturan bir genel nesneye sahipseniz, programınız çökebilir. Ama şimdi orijinal makaleyi bulamıyorum ve bunun bir kısıtlamanın ne kadar güçlü olduğunu merak ediyorum - standart tarafından kesinlikle doğru mu? Çoğu derleyicide doğru mu? C++ 0x'da geçerli mi kalacak? Compiler'ın kendiliğinden kendiliğinden başlatılmasını sağlamak için standartlara uyması mümkün mü? (örn. iki global nesnenin birbiriyle temas etmediğini algılamak ve program başlangıcını hızlandırmak için bunları ayrı iş parçacıklarında başlatmak)İş parçacıkları, statik başlatma sırasında güvenli bir şekilde oluşturulabilir mi?

Düzenleme: Açıklığa kavuşturmak için, en azından uygulamaların gerçekten önemli ölçüde farklılık gösterip göstermediğini anlamaya çalışıyorum Bu bağlamda veya sahte standart bir şeyse. Örneğin, teknik olarak standart, farklı erişim belirleyicilerine (genel/korunan/vb.) Ait üyelerin düzenini karıştırmaya izin verir. Ama bildiğim derleyici aslında bunu yapmaz.

+0

"Standart olarak kesinlikle doğru mu?" - C++ 03 standardının, iş parçacığı hakkında söyleyecek hiçbir şeyi yoktur. Mevcut davranışa göre bakılacak yerler, derleyici, platform ve iş parçacığı API'sı için POSIX (tabii ki * standart * değil, * standarttır), MSDN, Boost veya diğer uygulamaya özgü belgeler olacaktır. kullanın. –

cevap

6

Konuştuğunuz dilde kesinlikle değil, C Çalıştırma Zamanı Kitaplığı'nda (CRT).
Bir başlangıç ​​için, Windows'da CreateThread() gibi bir yerel çağrı kullanarak bir iş parçacığı oluşturursanız, istediğiniz herhangi bir yere yapabilirsiniz, çünkü doğrudan CRT'ye müdahale etmeden işletim Sistemine gider.
Genellikle sahip olduğunuz diğer seçenek, CRT'nin bir parçası olan _beginthread() kullanmaktır. Bir thread-safe errno gibi _beginthread() kullanmanın bazı avantajları vardır. Read more about this here. _beginthread() kullanarak iş parçacığı oluşturacaksanız, _beginthread() için gerekli olan başlatmaların yerinde olmayabileceği için bazı sorunlar olabilir. Bu, main()'dan önce tam olarak ne olduğu ve hangi sırada olduğu ile ilgili daha genel bir konuya değinir. Temel olarak, Visual Studio ile main()'dan önce gerçekleşmesi gereken her şeyin bakımını yapan programın giriş noktası işlevine sahip olursunuz, bu CRT kodunda yer alan ve tam olarak orada neler olup bittiğini öğrenebileceğiniz bir kod parçasına bakabilirsiniz. Bu koda ulaşmanın en kolay yolu, kodunuzdaki bir kesme noktasını durdurmak ve main()

+0

Teşekkürler, bu bana MSVC ile Windows'ta durumun nasıl olduğu hakkında bir fikir veriyor. Yine de diğer platformları merak ediyorum ve Windows'da güvenli olup olmadığına gerçekten cevap vermiyor (değil mi? _beginthread() aslında henüz gerçekleşmemiş olan herhangi bir başlatma işlemine güveniyor mu?). –

+0

Keşke bunu da biliyordum. Dokümanlar bundan bahsetmiyor. – shoosh

2

'dan önce yığın çerçevelerine bakmaktır. Temel sorun, DllMain'de yapabildiğiniz ve yapamayacağınız bir Windows kısıtlamasıdır. Özellikle, DllMain'de iş parçacığı oluşturmamanız gerekiyor. Statik başlatma genellikle DllMain'den olur. Sonra mantıksal olarak, statik başlatma sırasında iş parçacığı oluşturamazsınız.

+1

Ancak not: 'İşlem başlatma ve DLL başlatma yordamları sırasında, yeni iş parçacıkları oluşturulabilir, ancak http://msdn.microsoft adresinden işlem için DLL başlatma işlemi tamamlanıncaya kadar yürütmeye başlamazlar.com/en-us/library/ms682453% 28v = VS.85% 29.aspx –

+0

Fuar noktası bunu görmemişti. Bu yorumun özellikle 'CreateThread' için geçerli olduğunu unutmayın, ancak '_beginthreadex' bu istisnaya sahip değildir. – MSalters

0

C++ 0x/1x taslağını okuyarak söyleyebildiğim kadarıyla, main()'dan önceki bir iş parçacığı başlatılıyor, ancak yine de statik başlatma işleminin normal tuzaklarına maruz kalıyor. Uygun bir uygulama, herhangi bir statik veya iplik üreticisinin yapmadan önce iş parçacığı işlemeye yönelik kodun yürütülmesini sağlamalıdır.

İlgili konular