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