2012-04-07 24 views
8

kimse yerine yeni std::async ile deneyime sahip mi? Şu anda bir dosya yığınını okuyan ve bu parçayı bir async işlevine geçiren bir paralel dosya ayrıştırıcısını uyguluyoruz. Clang (v3.0) bu şekilde kullanılmasıGCC en std ile davranış :: zaman uyumsuz (std :: fırlatma :: zaman uyumsuz)

varsayılan std::async politikaları (uygulanmasına bağlı) ile gerçekten iyi çalışıyor. İki çekirdekli bir makinede, gerçekten iyi çalışan 4 parçayı ateşler.

Ama GCC (v4.7) ile

, dosya okuma ipliği tamamen sıralı sonunda programı yapma, herhangi bir yeni konuları yumurtlamaya etmez. std::launch::async kullanma

, her iki sürüm hemen hemen aynı (ne olması gerektiği durumda) yapıyoruz.

GCC'nin C++ 11 iş parçacığı yeteneklerinin akımının durumunu bilen var mı? Ya da bu bizim uygulamalarımızda bir hata olabilir mi?

Kısa kod:

while (readNewChunk()) { 
    Chunk &chunk = fileReader_.getChunk(); //reading the file 
    ChunkLoader *chunkLoader = new ChunkLoader(); 
    auto ftr = std::async(std::launch::async, &ChunkLoader::createDictionaries, chunkLoader); 
    dictCreationFutures_.push_back(std::move(ftr)); 
} 
+0

Gerçekten Boost'u kullanmanızı tavsiye ederim. Uygun C++ 11 desteğine büyük bir sıçrama olmayacaktır. C++ 11'deki yeni iş parçacığı modelleri, GCC veya MSVC'nin kullandığıdan farklı bir bellek düzeni gerektirir ve çok fazla uygulanmazlar. –

cevap

15

İstediğiniz özellik olmasa bile davranış, özellik dahilindedir. Bir lansman politikası belirtmezseniz, async|deferred olarak kabul edilir, yani hangisinin olduğuna karar vermek için uygulanması anlamına gelir. GCC, bir seçenek verilirse her zaman deferred'u seçer.

+0

Bunu temizlediğiniz için teşekkürler. Mevcut tüm uygulamaların biraz "daha zeki" olduğunu ve sadece düz bir _deferred_ yapmamalarını düşündüm. – Bouncner

+4

Ben katılmıyorum diyorum. Bu, standardın söylediği şeydir (vurgulama): "Bu politika," başlatma :: async | launch :: deferred "gibi bir politika değeri kullanıldığında olduğu gibi diğer politikalarla birlikte belirtilirse, uygulamaların çağrılması veya seçimin ertelenmesi gerekir. Daha fazla eşzamanlılık etkin bir şekilde sömürülmeyebilir. Bu, ertelenen yeni bir parçacığın başlatılmasından çok farklıdır. –

5

EDIT2: biraz daha açıklayacağız.

std :: async bir 'gelecek' sözü veriyor. yani: ne zaman istersen orada olacak. Şimdi hesaplanabilir, bunu sorduğunuzda hesaplanabilir, sadece olacağına söz veriyoruz.

altımdaki afiş notları gibi, ertelenmiş için GCC varsayılan (muhtemelen değil gerekirse önceden istedi ve zaman anlamına gelen bu sözünü yerine edeceğiz). Bu varsayılanın nedeni, GCC'nin henüz C++ 11 iş parçacığı desteği sağlamamasıdır. Diğer birçok şeyin yanı sıra iyi bir iç iş parçacığı programlayıcısı yoktur. Bu bir kesmek biraz. Hayır, daha çok bir kesmek gibi. Aslında, GCC'de C++ 11'de kodlanmış kod yazarsanız, özellikleri uyguladıklarında, doğru şekilde çalışır; Şu anda, çoğunlukla doğru çalışıyor. Yani, sonucu sonuna kadar aldın, değil mi?

Eğer bir iş parçacığı başlatmayı anlatırsanız, bunu yapabilecek ve bunu kendi başına yapabilmesi (şu anda daha iyi bir iç iş parçacığı zamanlayıcısı olan CLang'dan farklı olarak) için çok aptal olduğu için olacaktır.

DÜZENLEME: Cidden? Yanlış biçimlendirilmiş aşağı modding!

İşte referansım! http://gcc.gnu.org/projects/cxx0x.html. 'Bellek modeli' dahil olmak üzere 'eşzamanlılık' altındaki hemen hemen her şeyin NO olarak belirtildiğini unutmayın. GCC.GNU.org. Onlar bildiğin GCC'nin yetkisi.

hafifçe benim yorumum düzenlenebilir:

Gerçekten kullanarak artırın öneriyoruz. GCC hazır olduğunda uygun C++ 11 desteği için büyük bir sıçrama olmaz. C++ 11'deki yeni iş parçacığı modelleri, GCC veya MSVC'nin kullandığıdan farklı bir bellek düzeni gerektirir ve henüz çok fazla uygulanmadılar.

+3

"Bellek düzeni" açısından C++ 11'de neler değişti? –

+0

@NicolBolas http://gcc.gnu.org/projects/cxx0x.html. 'Bellek modeli' dahil olmak üzere 'eşzamanlılık' altındaki hemen hemen her şey, –

+5

no'lu olarak not edilir, ancak bu, "bellek * düzeni *" ile neyin değiştiğini açıklamıyor. Düzen, işlerin başka şeylere göre nereye gittiği ile ilgilidir. Bellek * modeli * erişilen değişkenlerin diğer iş parçacıklarında ve benzerlerinde görünür hale gelmesiyle ilgili kuralları açıklar. –

1

Bu yüzden 2 yıl sonra anlıyorum ama yardım edemem ama en azından şu anda Ocak 2015'te, @ std''OrgnlDave'ın GCC vs CLang hakkındaki yorumuna cevap verme ihtiyacını hissediyorum. argo sürüm 3.5 ve GCC sürüm 4.9 tam olarak aynı davranışı var.Bu davranış, hiçbir başlatma ilkesi sağlanmadığında, varsayılanın farklı olması ve gelecekteki :: get çağrıldığında çalıştırılması ve yalnızca zaman uyumsuzluğu ilkesinin açıkça sağlandığı durumlarda, derleyicinin arka planda işlevi yürütmesine neden olacağıdır.