Czy ktoś ma doświadczenie z dość nowym std::async
? Aktualnie wdrażamy równoległy parser plików, który odczytuje fragment pliku i przekazuje ten fragment do funkcji asynchronicznej.Zachowanie GCC z std :: async (std :: launch :: async) vs. zachowanie Clanga
Używanie Clang (v3.0) w ten sposób działa naprawdę dobrze przy domyślnych zasadach std::async
(zależnych od implementacji). Na dwurdzeniowym komputerze wystrzeliwuje do 4 wątków, co działa bardzo dobrze.
Ale z GCC (v4.7), wątek odczytu pliku nie spawnuje żadnych nowych wątków, przez co program na końcu jest całkowicie sekwencyjny.
Korzystanie z std::launch::async
, obie wersje są prawie robi to samo (co powinno być w tym przypadku).
Czy ktoś wie, jaki jest stan aktualnych możliwości gwintowania C++ w GCC? A może to błąd w naszej implementacji?
krótki 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));
}
Naprawdę polecam użycie funkcji Boost. To nie będzie duży skok do właściwej obsługi C++ 11. Nowe modele wątków w C++ 11 wymagają innego układu pamięci niż GCC lub MSVC i nie są one zaimplementowane tak naprawdę. –