【C++多线程编程】(四)之 创建线程方式

发布时间:2023年12月21日

方法一 推荐

将函数添加到线程中,并传入相应的参数即可

std::thread myThread(myThreadFunc, 5);

main函数是主线程

// 线程函数
void myThreadFunc(int n) {}

int main()
{
    // 创建并启动一个线程,并传递一个参数5给int n
    // 线程函数是否有参数决定了在创建线程时是否需要传递参数
    std::thread myThread(myThreadFunc, 5);
    
    // 主线程继续执行其他任务
    std::cout << "Hello from the main thread!" << std::endl;
    
    // 等待子线程myThread完成后在执行main主线程中的程序
    myThread.join();
}

myThread.join(); 是一个线程同步的操作,它会让主线程等待 myThread 执行完毕,然后再继续执行主线程的代码。具体来说,join() 函数会阻塞主线程,直到调用 join() 的线程(在这里是 myThread)执行完毕。

方法二

直接创建线程,没有名字

// 线程函数
void myThreadFunc(int n) {}

int main()
{
    // 创建并启动一个没有命名的线程,使用 Lambda 表达式作为线程执行体
    // detach() 用于将线程和主线程分离
    std::thread (myThreadFunc, 5).detach();
    
    // 主线程继续执行其他任务
    std::cout << "Hello from the main thread!" << std::endl;
    
    // 注意:没有调用 join(),因为线程被分离了
    
}

使用 detach() 将新线程和主线程分离。分离后,主线程将不再等待新线程的完成,新线程将在后台运行,直到它完成为止。

尽管这是一种创建没有命名线程的方式,但请注意,detach() 带来的线程分离可能会导致一些问题,如在主线程退出时新线程仍在运行,可能导致资源泄漏等。在实际应用中,最好使用 join() 或其他合适的线程管理机制确保线程的正常结束。

共享同一个线程函数

// 线程函数
void myThreadFunc(int n) {}

int main()
{
    // 创建并启动一个线程,并传递一个参数5给int n
    // 线程函数是否有参数决定了在创建线程时是否需要传递参数
    std::thread myThread1(myThreadFunc, 5);
    // 共享函数,仍然使用相同的线程执行体
    std::thread myThread2(myThreadFunc, 10);
    
    // 主线程继续执行其他任务
    std::cout << "Hello from the main thread!" << std::endl;
    
    // 等待子线程myThread完成后在执行main主线程中的程序
    myThread1.join();
    myThread2.join();
}
文章来源:https://blog.csdn.net/qq_54199287/article/details/135132271
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。