21xrx.com
2024-11-22 07:22:02 Friday
登录
文章检索 我的文章 写文章
C++多线程编程教程
2023-07-05 08:10:36 深夜i     --     --
C++编程 多线程 教程 并发编程 线程安全

C++多线程编程因为其高效性和并行性能而备受推崇。在现代计算机中,多核心处理器和高级图形处理器都能支持并行计算。这样的计算器件能够同时并行地执行多个任务,从而加速计算。

下面是一个简单的C++多线程编程教程,旨在帮助初学者了解如何创建和操作线程。

步骤一:导入头文件

在C++编译器中导入头文件即可开始多线程编程。以下是需要使用的头文件:


#include <iostream>

#include <thread>

步骤二:创建线程

使用std::thread类创建线程。将线程启动函数作为参数传递给该类的构造函数即可创建新线程。以下是示例程序:


void printHello()

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

int main() {

  std::thread t(printHello);

  t.join();

}

其中,printHello()函数即为线程启动函数,std::thread类的构造函数传递该函数名作为参数。

主函数中创建了一个名为t的新线程并加入主线程(即等待子线程结束)。最后,子线程输出“Hello from thread!”字符串。

步骤三:传递参数给线程

可以向线程传递参数。要实现这一点,只需将要传递的参数作为额外参数添加到线程的构造函数中:


void printNumber(int a)

  std::cout << "Number: " << a << std::endl;

int main() {

  int a = 42;

  std::thread t(printNumber, a);

  t.join();

}

其中,printNumber()函数的参数a作为第二个参数传递给线程t的构造函数。

步骤四:使用函数对象创建线程

C++允许将函数对象用作线程启动函数。函数对象与函数指针具有相似的行为,但可以快速创建对象。

下面是示例程序:


class HelloWorld {

public:

  void operator() () const

    std::cout << "Hello

};

int main() {

  HelloWorld hello;

  std::thread t(hello);

  t.join();

}

HelloWorld类是一个实现了运算符()的函数对象。这个运算符是该类唯一的公有成员函数。然后创建一个名为hello的HelloWorld对象,并使用它创建新线程t。

步骤五:与Lambda表达式一起使用

C++11引入了Lambda表达式,Lambda表达式是一个匿名函数,可以在运行时定义并使用。使用Lambda函数可以使代码更简洁。

以下是使用Lambda表达式创建线程的示例:


int main() {

  std::thread t([] std::cout << "Hello from thread!" << std::endl; );

  t.join();

}

在这里,Lambda表达式作为参数传递给thread构造函数。

步骤六:线程同步

线程同步是避免多个线程同时读取/写入同一资源并导致的竞争条件的过程。在C++中,使用互斥锁来同步线程。

以下是线程同步的示例:


#include <mutex>

std::mutex mtx;

void printBlock(char ch, int n) {

  mtx.lock();

  for (int i = 0; i < n; ++i)

    std::cout << ch;

  

  std::cout << std::endl;

  mtx.unlock();

}

int main() {

  std::thread t1(printBlock, '*', 10);

  std::thread t2(printBlock, '#', 10);

  t1.join();

  t2.join();

  return 0;

}

以上代码定义了一个mutex对象mtx,并在printBlock()函数内使用。在t1和t2线程中调用printBlock()函数,该函数使用mutex上锁来确保各自的资源正常输出。

总结:

C++多线程编程是在现代计算机和计算处理器上高效执行任务的关键技术。本教程向读者介绍了C++多线程编程的基础概念,包括创建线程、传递参数、使用函数对象、使用Lambda表达式以及线程同步。为方便初学者理解,教程提供了可执行的代码示例。欢迎其他开发者扩展本教程方法,提高学习成效。

  
  

评论区

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