C++ 并发

2024年8月28日 | 阅读 4 分钟

引言

“并发”一词描述了程序同时执行多个任务的能力。C++ 通过标准库中的线程类支持并发。线程是程序的基本执行单元,可以与其他线程并发操作。在本文中,我们将详细介绍 C++ 中的并发。

创建线程

要在 C++ 中创建线程,您必须首先定义线程将使用的函数,然后创建线程对象。执行函数的签名必须是 void。这是一个如何创建运行 foo() 函数的线程的示例

编码

在此示例中,使用 std::thread 函数对象创建的单独线程运行 foo() 函数。当新线程执行 foo 函数时,主线程继续运行。在程序结束之前,使用 join() 方法等待线程完成。

同步

为了防止并发访问公共资源,并发程序通常需要同步线程的执行。C++ 提供的同步支持机制包括互斥锁、条件变量和原子操作。

互斥锁

互斥锁(“相互排斥”的缩写)是一种同步原语,用于防止不同线程并发访问共享资源。互斥锁提供两种方法:lock() 和 unlock()。在线程运行 lock() 以获取互斥锁的所有权后,其他线程无法访问受保护的资源,直到使用 unlock 释放互斥锁为止。

这是一个如何使用互斥锁防止多个线程同时访问共享变量的示例

编码

在此示例中,两个线程使用互斥锁递增共享变量,以便每次只有一个线程可以访问它。因此,共享变量递增两次,最终值为 2。

条件变量

条件变量是另一种用于管理线程执行的同步工具。条件变量提供两个选项:wait() 和 notify_one()。使用条件变量上的 wait() 函数的线程会阻塞,直到另一个线程在同一个条件变量上使用 notify_one() 函数。

这是一个如何使用条件变量创建基本生产者-消费者队列的示例

编码

在此示例中,生产者线程将项目推送到队列后,消费者线程等待值可用后才消费它们。当值准备好消费时,通过条件变量 cv 通知消费者线程。

原子操作

同步访问共享资源的另一种方法是通过原子操作。原子操作是作为单个、内聚过程执行的操作,不涉及任何其他线程。整数、布尔值和指针只是 C++ 中可以原子操作的一些基本类型。

这是一个如何使用原子整数递增共享变量的示例

编码

在此示例中,共享变量是一个原子整数,允许多个线程安全地递增它,而无需使用互斥锁。

结论

总之,C++ 的并发特性是一个强大的功能,它允许程序同时运行多个任务。C++ 提供的并发支持方法包括线程、互斥锁、条件变量和原子操作。对于在 C++ 中创建有效和响应的并发程序,理解这些概念至关重要。


下一个主题C++ GUI