方法一 推荐
将函数添加到线程中,并传入相应的参数即可
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();
}