21xrx.com
2024-12-27 16:20:27 Friday
登录
文章检索 我的文章 写文章
C++11 Thread的使用方法
2023-07-09 00:31:28 深夜i     --     --
C++11 Thread 使用方法 多线程编程 并行计算

在C++11编程语言中,引入了一个新的库——Thread,使得多线程编程变得更加简单方便。本文将介绍C++11 Thread的使用方法。

1. 头文件

使用Thread时,需要在开头引入头文件:


#include <thread>

2. 线程创建

创建线程的方法是调用std::thread类的构造函数。创建线程有许多方法,其中一种最简单的方法是给std::thread构造函数传入一个函数指针或者一个可调用对象。例如,下面的代码创建了一个线程,并让它执行hello函数:


void hello() {

  std::cout << "Hello Concurrent World\n";

}

int main() {

  std::thread t(hello);

  t.join();

  return 0;

}

std::thread对象的构造函数会把hello函数作为一个可调用对象来保存,并在新线程中执行。

在上面的代码中,join()成员函数用来等待线程结束。如果没有调用join(),那么在主线程结束时,新线程可能还没有完成。如果这种情况发生了,程序就会崩溃。

3. 传递参数

std::thread的构造函数也可以传递参数。例如,下面的代码创建了一个线程,并且在这个线程中调用了函数f,同时传递了一个int类型的参数:


void f(int x)

  std::cout << "The value is " << x << std::endl;

int main() {

  std::thread t(f, 42);

  t.join();

  return 0;

}

在上面的代码中,f函数接受一个int类型参数x,并打印出x的值。在创建线程时,我们把42作为参数传递给了std::thread的构造函数。这样,在新线程中调用f函数时,就可以得到这个int类型的参数了。

4. 返回值

线程函数可以返回一个值,返回值会在新线程结束时被传递给调用线程。例如,下面的代码创建了一个线程,计算一个整数的平方并返回结果:


int square(int x) {

  return x * x;

}

int main() {

  std::thread t(square, 3);

  int result = t.join();

  std::cout << "The result is " << result << std::endl;

  return 0;

}

在上面的代码中,square函数计算参数的平方并将结果返回。在创建线程时,我们把3作为参数传递给std::thread的构造函数。在新线程中调用square函数时,就会获得这个参数,并计算出结果。最后,调用join()成员函数获取返回值。

5. 移动语义

std::thread对象是不可复制的,因此它只能被移动。最常见的方式是使用std::move函数。例如,下面的代码创建了一个线程,并将它移动到了另一个线程:


std::thread t1(hello);

std::thread t2 = std::move(t1);

t1.join();

t2.join();

在上面的代码中,我们创建了一个std::thread对象t1,并把它移动到了t2。在这之后,t1不再是一个有效的线程对象,因此我们不能再使用join()等成员函数。

6. 总结

C++11 Thread的使用方法非常简单,只需要了解std::thread的构造函数和成员函数即可。创建线程也非常容易,只需要传递一个函数指针或者一个可调用对象即可。当然,我们也可以传递参数或者返回值,并使用移动语义来操作线程对象。

  
  

评论区

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