21xrx.com
2024-11-22 07:13:55 Friday
登录
文章检索 我的文章 写文章
C++11创建线程
2023-06-28 06:11:44 深夜i     --     --
C++ 线程 C++11 并发编程 多线程

C++11是C++语言的最新标准,它在多线程编程方面进行了一些扩展和改进。C++11中引入了一个新的头文件 ,用于支持线程操作。通过这个头文件可以方便地创建、控制和同步线程等多线程操作。本文将介绍如何使用C++11创建线程。

1. 创建线程

C++11中创建线程非常简单,只需要创建一个线程对象,然后调用它的构造函数来启动线程。线程对象的构造函数接收一个可调用的函数对象作为参数,这个函数对象将在新创建的线程中执行。例如:


#include <iostream>

#include <thread>

void hello()

  std::cout << "Hello

int main() {

  std::thread t(hello);

  t.join();

  return 0;

}

上面的代码创建了一个名为t的线程对象,并把hello函数作为参数传递给了它的构造函数。在主线程中调用join函数等待t线程结束。当运行这段代码时,输出结果应该是:


Hello, world!

2. 传递参数给线程函数

有时候,我们需要在创建线程的时候向线程函数传递一些参数。可以通过将参数作为函数对象的构造函数的参数来实现。例如:


#include <iostream>

#include <thread>

void hello(std::string name) " << name << "!" << std::endl;

int main() {

  std::string name("world");

  std::thread t(hello, name);

  t.join();

  return 0;

}

上面的代码创建了一个名为name的字符串,并将其作为参数传递给了hello函数。在主线程中调用join函数等待t线程结束。当运行这段代码时,输出结果应该是:


Hello, world!

3. 竞争条件

在多线程编程中,竞争条件是一个常见的问题。竞争条件指的是多个线程在访问共享资源时,由于执行顺序的不确定性而导致的错误结果。在C++11中,多线程编程中常用的数据同步机制是互斥量(mutex)和条件变量(condition variable)。在上述例子中,由于线程函数只是简单地输出了一句话,没有访问共享资源的需求,所以并没有引入互斥量和条件变量。

4. C++11创建多个线程

C++11还提供了一种创建多个线程的方式,可以使用for循环和lambda表达式来创建多个线程。例如:


#include <iostream>

#include <thread>

int main() {

  const int num_threads = 10;

  std::thread threads[num_threads];

  for (int i = 0; i < num_threads; i++) {

    threads[i] = std::thread([i]()

      std::cout << "Hello from thread " << i << std::endl;

    );

  }

  for (auto& t : threads) {

    t.join();

  }

  return 0;

}

上面的代码创建了10个线程,并使用lambda表达式作为线程函数。在主线程中,使用for循环等待所有线程结束。当运行这段代码时,输出结果应该是:


Hello from thread 0

Hello from thread 1

Hello from thread 2

Hello from thread 3

Hello from thread 4

Hello from thread 5

Hello from thread 6

Hello from thread 7

Hello from thread 8

Hello from thread 9

总结

C++11提供了非常方便的线程支持,使得多线程编程更加容易。通过线程对象的构造函数,可以很容易地创建、管理和同步多个线程。需要注意的是,多线程编程中需要考虑竞争条件,使用互斥量和条件变量来解决共享资源的同步问题。

  
  

评论区

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