c++++ 并发编程通过创建线程、互斥锁和条件变量来充分利用多核 cpu 的优势。创建线程允许任务并行执行。互斥锁充当锁,确保共享数据不会被多个线程同时访问,从而避免数据损坏。条件变量用于通知线程特定条件已满足,并与互斥锁配合使用以防止线程继续执行直到条件满足。
C++ 并发编程:解锁多核 CPU
前言
现代 CPU 通常具有多个核心,通过充分利用这些核心,我们可以在并行执行任务时显着提高代码效率。C++ 提供了各种并发编程工具,使程序员能够轻松创建可以同时执行多个任务的应用程序。
创建线程
创建线程是表示并发的基本构造块。在 C++ 中,可以使用 std::thread
类创建新线程。它接受一个可调用对象作为参数,该对象指定在单独的线程中执行的任务。
#include <iostream>
#include <thread>
void hello_world() {
std::cout << "Hello, world!" << std::endl;
}
int main() {
std::thread thread1(hello_world);
thread1.join();
return 0;
}
在上面的代码中,hello_world()
函数是一个可调用对象,它只需向控制台打印一条消息。std::thread
构造函数创建一个新线程并执行可调用对象。thread1.join()
阻塞主线程,直到新线程完成。
互斥锁
线程并发访问共享数据时,互斥锁非常重要。它们充当锁,防止多个线程同时访问关键部分,从而避免数据损坏。在 C++ 中,可以使用 std::mutex
类创建互斥锁。
#include <iostream>
#include <thread>
#include <mutex>
std::mutex m; // 全局互斥锁
void increment(int& counter) {
std::lock_guard<std::mutex> lock(m); // 获取互斥锁
++counter;
}
int main() {
int counter = 0;
std::thread thread1(increment, std::ref(counter));
std::thread thread2(increment, std::ref(counter));
thread1.join();
thread2.join();
std::cout << "Final counter value: " << counter << std::endl;
return 0;
}
在这个示例中,increment()
函数对共享变量 counter
进行递增。我们使用 std::lock_guard
来获取互斥锁,确保只有一个线程可以同时执行关键部分。这种机制确保两个线程不会同时递增 counter
,从而避免数据竞争。
条件变量
条件变量用于通知线程特定条件已满足。它们与互斥锁一起使用,以确保线程在满足条件之前不会继续执行。在 C++ 中,可以使用 std::condition_variable
类创建条件变量。
#include <iostream>
#include <thread>
#include <condition_variable>
#include <mutex>
std::mutex m; // 全局互斥锁
std::condition_variable cv; // 全局条件变量
bool ready = false; // 共享布尔标志
void producer() {
std::lock_guard<std::mutex> lock(m); // 获取互斥锁
ready = true; // 设置共享标志为 true
cv.notify_one(); // 通知一个等待的线程
}
void consumer() {
std::unique_lock<std::mutex> lock(m); // 获取互斥锁(并锁定它)
while (!ready) // 等待共享标志为 true
cv.wait(lock); // 释放互斥锁并等待
}
int main() {
std::thread producer_thread(producer);
std::thread consumer_thread(consumer);
producer_thread.join();
consumer_thread.join();
return 0;
}
在此示例中,我们使用条件变量来协调生产者和消费者线程之间的交互。producer()
函数设置共享标志 ready
为 true 并通知消费者线程。consumer()
函数通过等待条件变量来等待共享标志为 true,然后继续执行。
以上就是C++并发编程:如何利用多核CPU实现并发?的详细内容,更多请关注编程网其它相关文章!