我创建了一个名为Timer的C ++类,它具有3种方法:
start()
方法启用一个名为run
的标志,并将其值设置为true
。
stop()
方法禁用该标志,将其值设置为false
。
print()
方法,在while()
的情况下执行run == true
,并打印一些半秒钟的文本。
Timer.hpp
#ifndef TIMER
#define TIMER 1
#include <iostream>
#include <cstdbool>
#include <unistd.h>
class Timer{
private:
bool run;
public:
void start();
void stop();
void print();
};
#endif
Timer.cpp
#include "Timer.hpp"
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;
}
main.cpp
#include <pthread.h>
#include "Timer.hpp"
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;
}
我的问题。
我创建了一个线程来处理方法start()
的执行,在主线程中创建了一个条件后,其中mainCounter
经过100次迭代后,它执行了timer->stop()
,但不会停止计时器循环。
mainCounter
到达第100次迭代时,它无法停止线程内部的循环。
要编译的指令是:
g++ Timer.cpp -c
g++ Timer.cpp main.cpp -o main -lpthread
输出为:
9
=> 90
=> 91
=> 92
=> 93
=> 94
=> 95
=> 96
=> 97
=> 98
=> 99
10
Stopping...
=> 100
=> 101
=> 102
=> 103
=> 104
=> 105
=> 106
=> 107
=> 108
=> 109
11
答案 0 :(得分:2)
如@ user4581301所述,这将解决问题:
pthread_create(&timer_thread, NULL, handler, (void *) &timer);
应该是
pthread_create(&timer_thread, NULL, handler, (void *) timer);
问题是timer
指向已分配的Timer
类,而&timer
指向堆栈中的某个位置。在运行线程时,您尝试访问run
类成员,但是由于this
指向堆栈,因此您实际上正在读取不正确的值。
其他说明:将bool run
声明为std::atomic_bool run
,或将任何互斥机制用于线程安全。另外,请始终删除分配的变量:delete timer
。