You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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类添加布尔成员变量控制循环:

  1. 在Menu类中添加成员:
    bool is_running = true;
    
  2. 修改title_up_down的循环条件:
    for (int k = 0; is_running; k++)
    
  3. 在程序退出前(比如main函数的循环结束后)设置menu.is_running = false;,让线程自然退出。

4. 避免控制台输出混乱

主线程和子线程同时操作控制台会导致排版错乱,可通过互斥锁同步输出:

  1. 在Menu类中添加互斥锁成员:
    std::mutex cout_mutex;
    
  2. 在所有控制台输出代码段前加锁:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 18:32:06