其他分享
首页 > 其他分享> > c – 使用两个线程运行和中断无限循环

c – 使用两个线程运行和中断无限循环

作者:互联网

我试图运行一个循环,直到用户选择打破它.无论用户是想要整晚运行该功能还是仅仅几秒钟,循环应该重复,直到用户决定停止它.

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

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

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

解决方法:

我通常使用原子< int>或原子< 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.
}

标签:c,c11,multithreading,infinite-loop
来源: https://codeday.me/bug/20191006/1858931.html