C++类中创建独立线程遇问题:线程ID重复、无法独立休眠求助
问题分析与解决方案
你的核心问题在于线程的创建和执行时机控制错误,导致myprint和mycount没有真正运行在独立线程中,或者执行顺序被主线程阻塞打乱。
原代码的问题点
func()中创建myprint线程后立刻调用mythread.join(),这会让主线程阻塞等待myprint执行完毕,之后才会调用mycount()——也就是说mycount()是在主线程中执行的,和myprint的子线程ID本应不同。你看到ID相同,大概率是后续修改代码时,错误地让mycount复用了同一个线程对象,或者没有为它创建独立线程。main函数的循环会反复创建myprint线程、等待它结束、再调用mycount,这种串行执行的逻辑根本无法实现两个函数独立休眠、并行运行的效果。
正确实现方式
要让myprint和mycount各自在独立线程运行、拥有不同ID且休眠互不影响,需要分别为它们创建线程,并合理管理线程生命周期。同时,由于两个函数都会操作共享变量count,必须用互斥锁保证线程安全:
#include <iostream> #include <thread> #include <chrono> #include <mutex> using namespace std; using namespace chrono_literals; class foo { private: int count = 0; mutex mtx; // 互斥锁保护共享变量,避免读写冲突 public: // 启动myprint线程 void start_print() { thread print_thread(&foo::myprint, this); print_thread.detach(); // 让线程后台运行,也可保存为成员变量后续join } // 启动mycount线程 void start_count() { thread count_thread(&foo::mycount, this); count_thread.detach(); } void myprint() { while (true) { this_thread::sleep_for(1s); lock_guard<mutex> lock(mtx); // 加锁保护count cout << "myprint 线程ID: " << this_thread::get_id() << " | 当前count值: " << count << endl; } } void mycount() { while (true) { this_thread::sleep_for(1ms); lock_guard<mutex> lock(mtx); count++; cout << "mycount 线程ID: " << this_thread::get_id() << " | 当前count值: " << count << endl; } } }; int main() { foo obj; obj.start_print(); obj.start_count(); // 主线程保持存活,防止程序直接退出 while (true) { this_thread::sleep_for(10s); } return 0; }
关键说明
- 独立线程创建:分别为
myprint和mycount创建线程,它们会被操作系统调度为独立执行流,线程ID必然不同,休眠操作也互不干扰。 - 线程安全:用
std::mutex和std::lock_guard保护共享变量count,避免多线程同时读写导致的未定义行为。 - 线程生命周期:示例中用
detach()让线程后台运行,如果你需要更安全的线程管理,可以把std::thread对象保存为类的成员变量,在类析构时调用join()等待线程结束。 - 关于
std::call_once:这个函数的作用是保证某个函数在多线程环境下只被执行一次,和线程ID是否相同无关,不会影响你的需求实现。
内容的提问来源于stack exchange,提问作者Tolisios
相关产品推荐
相关产品推荐

