使用两个线程运行并中断一个无限循环
我试图运行一个循环,直到用户选择摆脱它。 无论用户是想要整夜运行还是仅需几秒钟,循环都应该重复,直到用户决定停止。
在研究解决方案时,我遇到了使用两个线程来实现这一点。 第一个线程将运行无限循环,而第二个线程等待用户输入。 在收到该输入后,第二个线程将终止第一个线程,然后返回。
#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