21xrx.com
2025-06-30 04:52:02 Monday
登录
文章检索 我的文章 写文章
如何在C++中开启线程
2023-07-01 09:15:01 深夜i     24     0
C++ 线程 开启 创建 pthread_create()函数

C++是一种常用的编程语言,线程是它重要的特性之一。线程的出现可以使程序在多个任务之间并行执行,提高程序的运行效率。如果你想在C++中开启线程,下面的方法可以帮助你实现。

1. 头文件包含

在使用线程的时候,首先需要包含头文件"thread"。 在C++11之前,是不支持线程的,因此必须使用C++11及以上的版本。

#include <iostream>
#include <thread>

2. 使用std::thread类创建新线程

C++中的std::thread类是用于创建线程的类,它的构造函数接受一个函数指针作为参数,并在新线程中执行该函数。

下面的代码片段演示了如何创建一个新线程:

void workThread()
  std::cout << "This is a new thread" << std::endl;
int main()
{
  std::thread t(workThread);
  std::cout << "This is the main thread" << std::endl;
  t.join(); //等待新线程完成
  return 0;
}

其中workThread()是创建的新线程需要执行的函数,t是std::thread类型的对象,用于表示新线程,并将workThread()函数指针传递给t的构造函数。main()函数是主线程,在主线程中打印"This is the main thread",新线程打印"This is a new thread",然后t.join()在主线程中等待新线程执行完毕。

3. 传递参数给新线程

除了指定函数指针之外,还可以在创建新线程时传递参数。

下面的代码演示了如何创建一个参数化线程:

void workThread(int num)
  std::cout << "This is thread " << num << std::endl;
int main()
{
  std::thread t(workThread, 2);
  t.join();
  return 0;
}

这里workThread()函数接受一个int类型参数,即该线程的编号,std::thread t的构造函数第二个参数是该编号,t.join()等待线程完成。

4. 使用RAII(资源获取即初始化)技术释放线程资源

在使用线程时,我们需要确保将线程所占用的资源释放掉,因此需要在线程执行完成之后手动回收线程资源。释放资源的方法有两种:一种是调用std::thread::detach(),另一种是调用std::thread::join()。

detach()方法会分离线程,将线程资源交给操作系统管理,执行该方法后线程在主程序运行完成后,并不等待线程执行完成,因此无法保证线程的正确执行。

join()方法则会等待子线程结束运行后才会退出主程序。即程序会在等待子线程的过程中一直阻塞。

尽管主程序等待子线程完成的方法是可行的,并且也是最常用的,但另一种方法也是必要的,即在创建线程时使用RAII技术。RAII简单来说就是在构造函数中获取资源,在析构函数中释放资源。

下面是使用RAII技术释放线程资源的示例代码:

class ThreadWrapper
{
public:
  ThreadWrapper(std::function<void()> threadFn) : m_thread(threadFn) {}
  ~ThreadWrapper() { if(m_thread.joinable()) m_thread.join(); }
private:
  std::thread m_thread;
};
void workThread()
  std::cout << "This is a new thread" << std::endl;
int main()
{
  ThreadWrapper t(workThread);
  std::cout << "This is the main thread" << std::endl;
  return 0;
}

以上代码中,ThreadWrapper类使用了 RAII 技术,也就是在线程的构造函数中创建线程,在析构函数中安全地清理线程资源。

总结一下,以上是在C++中开启线程的相关方法,无论是创建线程,传递参数还是释放线程资源,都需要我们仔细思考并谨慎操作,以保证程序的正确性和效率。

  
  

评论区