停止在线程中运行的类方法

时间:2019-04-09 17:04:10

标签: c++ multithreading

我创建了一个名为Timer的C ++类,它具有3种方法:

  • start()
  • stop()
  • print()

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

Try it online!

1 个答案:

答案 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