#include <iostream>
#include <cstdbool>
#include <unistd.h>
#include <pthread.h>
class Timer{
private:
bool run;
public:
void start();
void stop();
void print();
};
void Timer::start(){
this->run = true;
this->print();
return;
}
void Timer::stop(){
this->run = false;
return;
}
void Timer::print(){
int counter = 0;
while(this->run == true){
std::cout << counter << std::endl;
counter++;
usleep(500000);
}
return;
}
void *handler(void *argument){
((Timer *) argument)->start();
return argument;
}
int main(void){
Timer *timer = new Timer();
pthread_t timer_thread;
int mainCounter = 0;
pthread_create(&timer_thread, NULL, handler, (void *) &timer);
while(true){
if(mainCounter == 100){
std::cout << "Stopping..." << std::endl;
timer->stop();
}
std::cout << " => " << mainCounter << std::endl;
mainCounter++;
usleep(50000);
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGJvb2w+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHB0aHJlYWQuaD4KCmNsYXNzIFRpbWVyewpwcml2YXRlOgogICAgYm9vbCBydW47CgpwdWJsaWM6CiAgICB2b2lkIHN0YXJ0KCk7CiAgICB2b2lkIHN0b3AoKTsKICAgIHZvaWQgcHJpbnQoKTsKCn07Cgp2b2lkIFRpbWVyOjpzdGFydCgpewogICAgdGhpcy0+cnVuID0gdHJ1ZTsKICAgIHRoaXMtPnByaW50KCk7CiAgICByZXR1cm47Cn0KCnZvaWQgVGltZXI6OnN0b3AoKXsKICAgIHRoaXMtPnJ1biA9IGZhbHNlOwogICAgcmV0dXJuOwp9Cgp2b2lkIFRpbWVyOjpwcmludCgpewoKICAgIGludCBjb3VudGVyID0gMDsKCiAgICB3aGlsZSh0aGlzLT5ydW4gPT0gdHJ1ZSl7CgogICAgICAgIHN0ZDo6Y291dCA8PCBjb3VudGVyIDw8IHN0ZDo6ZW5kbDsKICAgICAgICBjb3VudGVyKys7CgogICAgICAgIHVzbGVlcCg1MDAwMDApOwogICAgfQoKICAgIHJldHVybjsKfQoKdm9pZCAqaGFuZGxlcih2b2lkICphcmd1bWVudCl7CgogICAgKChUaW1lciAqKSBhcmd1bWVudCktPnN0YXJ0KCk7CgogICAgcmV0dXJuIGFyZ3VtZW50Owp9CgppbnQgbWFpbih2b2lkKXsKCiAgICBUaW1lciAqdGltZXIgPSBuZXcgVGltZXIoKTsKICAgIHB0aHJlYWRfdCB0aW1lcl90aHJlYWQ7CiAgICBpbnQgbWFpbkNvdW50ZXIgPSAwOwoKICAgIHB0aHJlYWRfY3JlYXRlKCZ0aW1lcl90aHJlYWQsIE5VTEwsIGhhbmRsZXIsICh2b2lkICopICZ0aW1lcik7CgogICAgd2hpbGUodHJ1ZSl7CgogICAgICAgIGlmKG1haW5Db3VudGVyID09IDEwMCl7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiU3RvcHBpbmcuLi4iIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgdGltZXItPnN0b3AoKTsKICAgICAgICB9CgogICAgICAgIHN0ZDo6Y291dCA8PCAiID0+ICIgPDwgbWFpbkNvdW50ZXIgPDwgc3RkOjplbmRsOwogICAgICAgIG1haW5Db3VudGVyKys7CgogICAgICAgIHVzbGVlcCg1MDAwMCk7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCg==