21xrx.com
2024-12-26 16:06:08 Thursday
登录
文章检索 我的文章 写文章
如何在C++中开启线程
2023-07-01 09:15:01 深夜i     --     --
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++中开启线程的相关方法,无论是创建线程,传递参数还是释放线程资源,都需要我们仔细思考并谨慎操作,以保证程序的正确性和效率。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复