C++11 std::thread vs windows CreateThread

Quale opzione è meglio per la creazione (e la gestione) thread in Visual C++: C++11 std::thread o WinAPI funzioni (come CreateThread, _beginthreadex, etc.) e perché?

  • std::thread è migliore perché è standard e portatile
  • std::thread consente di scrivere applicazioni cross-platform. E, se hai ancora bisogno di fare qualcosa di specifico per la piattaforma con un thread creato tramite l’API, è possibile ottenere l’attuazione di gestire via native_handle, e passare alla piattaforma di specifiche funzioni.
  • Nota che su Windows, non si deve usare CreateThread, si dovrebbe utilizzare _beginthreadex in modo che il CRT locale di thread di archiviazione è inizializzato correttamente. std::thread è il C++11 modo per farlo, e su piattaforme Microsoft fa uso di ConCRT/ppl. std::thread ha il vantaggio di lavorare per le app di Windows Store, dove l’altro thread Api non sono disponibili.
  • CreateThread davvero non è più un problema, tranne che in alcuni rari casi limite (più in particolare, se l’app si deve affrontare quando criticamente a corto di memoria o spazio di indirizzi). In circostanze normali, il CRT inizializzerà il proprio spazio di archiviazione necessario.
  • FWIW, std::unique_ptr rende RAII con CreateThread possibile-utilizzare CloseHandle come il deleter funzione.
  • Definire “migliore” (o, in alternativa, il punto di vista siete interessati a giudicare da questo) o questa è una “opinione”.

InformationsquelleAutor KaMyLuS | 2014-08-09



2 Replies
  1. 36

    Portabilità

    std::thread è nuovo standard C++11 – con esso, è possibile scrivere codice portabile in C++ su compilatori supportano C++11. Si può sentire il future in esso.

    È basato su boost::thread, che supporta i vecchi compilatori non supportano C++11, il che rende il porting verso altre piattaforme ancora più facile.

    Se è necessario utilizzare la piattaforma trucchi specifici, std::thread::native_handle è il modo per go.

    CreateThread è specifico per WinAPI, questo implica la scrittura non-portatile di codice. Inoltre, questa API è abbastanza vecchio e più scomodo da usare.

    RAII

    WinAPI è una API C di cui non incoraggiare moderna C++ buona pratiche. Ogni filettatura primitiva si crea, dovete distruggere manualmente.

    Questo non è il caso per il thread libreria in C++11, e questo rende astrazioni di livello superiore più facile da scrivere. Mentre std::thread è ancora abbastanza di basso livello (o si .join() o .detach() il thread, o il filo distruttore terminerà il vostro programma), C++11 filettatura biblioteca ha std::lock_guard e altro blocco di classi per il supporto RAII per mutex.

    Mentre C++11 ha alcune astrazioni di livello superiore, come std::async per il lancio di funzioni in modo asincrono, non fornisce altre astrazioni, come threadpools, in modo che si può utilizzare altre librerie.

    Di sicurezza di tipo

    WinAPI possibile chiamare solo i puntatori a funzione con firma specifica – che è soggetto a bug relativi alla sicurezza, tipo di vita degli oggetti e la gestione dei contenuti di memoria.

    std::thread possibile chiamare qualsiasi callable oggetto:

    //call free-standing function in a separate thread
    std::thread first(func);
    
    //call free-standing function with arguments (1, 2), in a separate thread
    std::thread second(func, 1, 2); 
    
    //call static member function in a separate thread
    std::thread third(&A::static_memfun); 
    
    //call non-static member of a temporary in a separate thread
    std::thread fourth(&A::memfun, A());
    
    //call std::function in a separate thread
    std::function<void(int)> callback = std::bind(func, 1, _1);
    std::thread fifth(callback, 2);
    
    //call a function object
    Functor f;
    std::thread sixth(f);

    TL;DR: non C’è alcun motivo per utilizzare WinAPI thread principale filettatura meccanismo nuovo codice C++.

    • Sentire il future, haha.
    • e l’esperienza broken_promises
    • Anche tenere a mente che utilizzando std::thread invece di CreateThread aumenterà in modo significativo l’utilizzo della memoria e la dimensione del file eseguibile del programma, in base a diversi fattori come la quantità di thread creati, statico vs dinamico di collegamento e di compilare le ottimizzazioni.
    • necessaria]
    • L’ho visto me stesso, sui miei progetti quando ho deciso di provare il nuovo C++ thread. Tutto quello che dovete fare è sostituire il vostro CreateThread chiamate con std::thread var(...) e funziona subito. Poi basta confrontare il risultato con il vecchio eseguibile.
  2. 7

    Croce-platformity è un piccolo beneficio. Il vero vantaggio è nell’interfaccia. std::thread offre RAII-garanzie per la pulizia del thread, e supporta la funzione arbitraria oggetto argomenti invece di puntatori a funzione. std::thread è il C++11 wrapper su CreateThreadEX ed è così per un motivo.

    Solo una piccola nota, std::thread è un terribile, terribile API. Se si sta creando thread di te, probabilmente stai facendo sbagliato. Utilizzare un vero e proprio filettatura API come Intel TBB o Microsoft PPL, che sono notevolmente superiore al terribile std::thread e in qualche modo anche peggio CreateThreadEx. std::thread è del tipo: “Ehi ragazzi, ho offerto cross-platform mmap, così si potrebbe scrivere il proprio malloc sulla parte superiore, godere!”.

    • Beh, io preferisco fare il mio malloc in cima mmap che solo avendo malloc e cercando di hackerare un mmap su di esso. Essendo di basso livello non è terribile. Senza il materiale a basso livello, non avremmo mai avuto la bella alta funzionalità a livello di
    • Hai ragione. Tranne che praticamente nessuno può effettivamente implementare thread astrazioni correttamente sulla parte superiore del std::thread, e solo il realizzatore deve std::thread, non l’utente.
    • std::thread non è neanche una RAII classe (almeno non nel senso classico del termine): È il distruttore non ripulire il thread termina il programma.

Lascia un commento