使用两个线程运行并打破无限循环

时间:2014-07-15 21:51:23

标签: c++ multithreading c++11 infinite-loop

我正在尝试运行一个循环,直到用户选择突破它。无论用户是想整夜运行该功能还是只需几秒钟,循环应该重复,直到用户决定停止它为止。

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

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

#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();
};

1 个答案:

答案 0 :(得分:6)

我通常使用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.
}