使用两个线程运行并中断一个无限循环

我试图运行一个循环,直到用户选择摆脱它。 无论用户是想要整夜运行还是仅需几秒钟,循环都应该重复,直到用户决定停止。

在研究解决方案时,我遇到了使用两个线程来实现这一点。 第一个线程将运行无限循环,而第二个线程等待用户输入。 在收到该输入后,第二个线程将终止第一个线程,然后返回。

  • 我如何使用第二个线程来终止第一个线程?

  • #include <iostream>
    #include <iomanip>
    #include <ctime>
    #include <thread>
    #include <cstdlib>
    #include <Windows.h>
    
    using namespace std;
    
    void timeCount()
    {
        time_t rawTime;
        struct tm * timeinfo;
    
        do
        {
            Sleep(500);
            system("cls");
            time(&rawTime);
            cout << "Seconds passed this epoch:" << rawTime << endl << endl;
            timeinfo = localtime(&rawTime);
            cout << "The local time is:" << asctime(timeinfo) << endl;
            timeinfo = gmtime(&rawTime);
            cout << "The UTC time is :" << asctime(timeinfo) << endl;
        } while (1 != 0);
    
    };
    
    void getStop()
    {
        system("pause");
    };
    
    void timeSince()
    {
        thread counter(timeCount);
        thread stopper(getStop);
        counter.detach();
        stopper.join();
    
        counter.~thread();
    };
    

    我通常使用atomic<int>atomic<bool>来做到这一点。


    线程功能

    void run( atomic<bool> & quit ) {
       while (!quit) {
          // Do some work.
       }
    }
    

    Mainthread:

    int main() {
       // Just to show you can do this with more than 1 extra thread.
       unsigned int nThreads = std::thread::hardware_concurrency(); 
    
       std::atomic<bool> loopFlags[nThreads];
       std::thread       threads[nThreads];
    
       // Start threads
       for ( int i = 0; i < nThreads; i++) {
           loopFlags[i] = false;
           threads[i]   = std::thread(run, std::ref(loopFlags[i]));
       }
    
       usleep(10000); // Sleep for a while or do something else.
    
       // Shutdown other threads
       for ( auto & flag : loopFlags ) {
           flag = true;
       }
    
       // Wait for threads to actually finish.
       for ( auto& thread : threads ) {
           thread.join();
       }
       // Resume what you were doing.
    }
    
    链接地址: http://www.djcxy.com/p/5209.html

    上一篇: Run and break an infinite loop using two threads

    下一篇: std::async not executing when specifying launch::async