variadic template



  • Zu CreateThread mal ein kleines Zitat aus der MSDN:

    A thread in an executable that calls the C run-time library (CRT) should use the _beginthreadex and _endthreadex functions for thread management rather than CreateThread and ExitThread; this requires the use of the multithreaded version of the CRT. If a thread created using CreateThread calls the CRT, the CRT may terminate the process in low-memory conditions.



  • krümelkacker schrieb:

    Sone schrieb:

    Mach doch sowas in der Richtung:

    ... std::bind ...
    

    Wenn du std::bind dafür verwendest, ist es dir nicht Möglich Objekte von move-only Typen an einen Thread "per value" zu übergeben, da bind die gebundenen Parameter als Lvalue übergibt; denn man könnte den Funktor ja mehrmals ausführen und beim zweiten Mal soll es immer noch "funktionieren". std::thread fürht das Ding aber garantiert höchstens nur einmal aus. Es darf also gebundene Parameter als Rvalue übergeben.

    Stimmt, fällt mir auf. Das hält seine Parameter in einem std::tuple...
    Wie wärs mit einem Gefrickel mit std::reference_wrapper ? 😃
    Edit: Nope. Temporäre Objekte können ja mit std::reference_wrappe r nicht gehalten werden, und sowieso...



  • Sone schrieb:

    unskilled schrieb:

    und da ich den api-aufruf auch ganz gern im source-file hätte, fehlt mir schon der ansatz. 😕

    Der API-Aufruf findet doch aber in einem Funktionstemplate statt? Und das kannste ja nicht in Source&Header aufteilen...

    und weil ich denke, dass iwer nen vorschlag hat, wie es doch geht, habe ich hier gepostet...



  • unskilled schrieb:

    und weil ich denke, dass iwer nen vorschlag hat, wie es doch geht, habe ich hier gepostet...

    siehe meinen ersten Beitrag.



  • Warum baust du std::function nach, kk?



  • krümelkacker schrieb:

    unskilled schrieb:

    und weil ich denke, dass iwer nen vorschlag hat, wie es doch geht, habe ich hier gepostet...

    siehe meinen ersten Beitrag.

    ahhh - ganz übersehen. danke : >

    bb



  • Kellerautomat schrieb:

    Warum baust du std::function nach, kk?

    Tue ich gar nicht. std::thread kannst du weder mit std::bind noch mit std::function implementieren -- jedenfalls nicht ohne größere Umwege. Der Standard verlangt, dass bei std::thread Rvalue-Parameter als solche weitergereicht werden.

    Edit: Gut, man könnte std::function doch verwenden ... aber ich wüsste nicht, was das bringen sollte außer einer zusätzlichen Indirektion, auf die ich gern verzichten würde ...



  • [quote="Sone"]

    template<typename Callable>
    DWORD WINAPI dummyFunc(LPVOID ptr)
    {
            (*reinterpret_cast<Callable*>(ptr))();
            return 0;
    }
    
    struct thread
    {
            template<typename Callable, typename ... argTs>
            thread(Callable&& callable, argTs&&... args)
            {
                    auto bound = std::bind(std::forward<Callable>(callable), std::forward<argTs>(args)...);
                    auto ptr = dummyFunc<decltype(bound)>;
    
                    mHandle = CreateThread(nullptr, 0, ptr, &bound, 0, nullptr);
    

    Oh, ich sehe gerade, dass du einen Zeiger auf ein automatisches Objekt übergibst. Das Objekt "bound" verschwindet doch aber gleich, wenn der Konstruktor fertig ist. 'Ne Freispeicherallozierung ist da schon praktischer. 😉



  • Edit: Gleich kommt ne gefixte Version.



  • Der reinterpret_cast ist unnoetig.


Anmelden zum Antworten