如何在C++中将类成员方法放入线程?代码问题求助
正确将类成员方法放入线程的方案
1. 修复线程创建的核心错误
你当前创建线程的代码写法完全错误:
std::thread t1(&title_up_down(), this);
类成员函数的地址必须以类名::函数名的形式传递,且不能加括号(加括号会直接调用函数而非传递地址),修正后的创建代码应为:
std::thread t1(&Menu::title_up_down, this);
2. 处理线程生命周期问题
setup函数执行完毕后,局部线程对象t1会被销毁,若此时线程仍在运行会直接导致程序崩溃,必须选择以下两种处理方式之一:
- 分离线程:让线程在后台独立运行,使用
detach():std::thread t1(&Menu::title_up_down, this); t1.detach(); - 等待线程结束:若你的标题动画不是死循环,可使用
t1.join(),但你的title_up_down是无限循环,此方式不适用。
3. 解决死循环终止问题
你的title_up_down是无限循环,程序退出时无法正常终止线程,建议给Menu类添加布尔成员变量控制循环:
- 在
Menu类中添加成员:bool is_running = true; - 修改
title_up_down的循环条件:for (int k = 0; is_running; k++) - 在程序退出前(比如
main函数的循环结束后)设置menu.is_running = false;,让线程自然退出。
4. 避免控制台输出混乱
主线程和子线程同时操作控制台会导致排版错乱,可通过互斥锁同步输出:
- 在
Menu类中添加互斥锁成员:std::mutex cout_mutex; - 在所有控制台输出代码段前加锁:
std::lock_guard<std::mutex> lock(cout_mutex); // 这里写输出代码
修正后的setup函数关键片段
void Menu::setup() { system("cls"); draw_title(); std::thread t1(&Menu::title_up_down, this); t1.detach(); std::lock_guard<std::mutex> lock(cout_mutex); std::cout << "\n\n\n"; std::cout << std::setw(w1 - 1) << " ---------------\n"; std::cout << std::setw(w1) << "| 1. New Game |\n"; std::cout << std::setw(w1 - 1) << " ---------------\n"; std::cout << std::setw(w1 + 1) << " -------------------\n"; std::cout << std::setw(w1 + 2) << "| 2. Description |\n"; std::cout << std::setw(w1 + 1) << " -------------------\n"; std::cout << std::setw(w1) << " -----------------\n"; std::cout << std::setw(w1 + 1) << "| 3. Exit Game |\n"; std::cout << std::setw(w1) << " -----------------\n"; std::cout << "Choose your option: "; }
内容的提问来源于stack exchange,提问作者Azazo8
相关产品推荐
相关产品推荐

