Exit Thread (Loop)



  • Guten Morgen Leute,

    ich habe einen Thread/Timer implementierung, die ich starten und stoppen möchte. Nun habe ich 2 Mögliche implemtierungen (psyeudo).

    A (mit condition variable)

    Starten

    
    std::mutex _exitLock;
    std::condition_variable cv;
    bool done = false;
    ...
    
    _thread.reset(new std::thread(&Foo::ThreadLoop, this));
    

    Die Loop

    void ThreadLoop()
    {
    		while (true)
    		{
    			{
    				/* check exits condition */
    				std::unique_lock<std::mutex> lock(_exitLock);
    				if (cv.wait_for(lock, std::chrono::milliseconds{ 1000 }, [this]() {return _done; }))
    				{	
    break;
    				}
    			}
    		}
    }
    

    Stoppen

    /* set exit loop flag */
    {
    	std::lock_guard<std::mutex> lock(_exitLock);
    	_done= true;
    }
    
    /* exit thread */
    cv.notify_all();
    _thread->join();
    _done= false;
    

    B (Exit flag bool)

    Starten

     std::atomic<bool> _done;
    
    ..
    
    
    _thread.reset(new std::thread(&Foo::ThreadLoop, this));
    
    void ThreadLoop()
    {
    		while (!_done)
    		{
    		std::this_thread::sleep_for(std::chrono::seconds(1));
    		}
    }
    

    Stoppen

    _done= true;
    /* exit thread */
    _thread->join();
    
    

    nun ist option B "übersichtliche" der Vorteil von "A" ist , dass die loop auch während sie schläft direkt beendet wird (nehm ich an).

    Aber egal, wann verwendet ich was.. bzw. gibt noch ne schönere lösung?

    Danke euch



  • @SoIntMan Wenn es nur ums stoppen geht kannst du dir mal std::jthread::request_stop anschauen.

    Ich würde prinzipiell auf jthread umstellen. Das macht keinen Unterschied, bis auf "stopbar" und der rejoined im Destruktor automatisch, was das RAII verhalten ist, was man eigentlich von einem Thread erwarten würde.



  • @Schlangenmensch sagte in Exit Thread (Loop):

    @SoIntMan Wenn es nur ums stoppen geht kannst du dir mal std::jthread::request_stop anschauen.
    Ich würde prinzipiell auf jthread umstellen. Das macht keinen Unterschied, bis auf "stopbar" und der rejoined im Destruktor automatisch, was das RAII verhalten ist, was man eigentlich von einem Thread erwarten würde.

    interessant der JThread.. aber ich verwende C++14 da muss ich beim alten bleiben;)


Anmelden zum Antworten