Maxbad`Blog

C++11:参数按成员函数启动线程

2020-10-08 · 2 min read

使用非静态类成员上述作为线程启动函数

#include <thread>
#include <atomic>
 
class Task {
public:
Task(){
    cnt_thread.store(0);
	exit_workThread.store(false);
    
  std::thread th(&Task::execute, this, "Sample Task"); 
  th.detach();

}
~Task(){
	exit_workThread.store(true);
    while (cnt_thread);
}
  void execute(std::string command) {      
	cnt_thread++;
    int i = 0;
    while(1)
    {
        if (exit_workThread)
			break;
              std::cout<<command<<" :: "<<i<<std::endl;
		this_thread::sleep_for(std::chrono::seconds(1));
              i++
    }  
	cnt_thread--;
  }
  private:  
	std::atomic<int>         cnt_thread;
	std::atomic<bool>        exit_workThread;
};
 
int main() {
  Task * taskPtr = new Task();  
 getchar();
  delete taskPtr;
  
  return 0;
}
 

使用静态成员函数作为线程启动函数

由于静态函数不依赖于任何类对象,所以我们可以直接将静态成员函数作为线程启动函数,而不必传递对象指针。

#include <thread>
 
class Task {
public:
    static void test(std::string command) {
        for(int i = 0; i < 5; i++) {
            std::cout<<command<<" :: "<<i<<std::endl;
        }
    }
};
 
int main() {
    // Create a thread using static member function
    std::thread th(&Task::test, "Task");
 
    th.join();
    return 0;
}

// 输出如下:
Task :: 0
Task :: 1
Task :: 2
Task :: 3
Task :: 4

参考链接
https://thispointer.com/c11-start-thread-by-member-function-with-arguments/