首頁 > 後端開發 > C++ > C++並發程式設計:如何利用多核心CPU實作並發?

C++並發程式設計:如何利用多核心CPU實作並發?

PHPz
發布: 2024-05-01 11:51:01
原創
320 人瀏覽過

C 並發程式設計透過建立執行緒、互斥鎖和條件變數來充分利用多核心 CPU 的優勢。創建線程允許任務並行執行。互斥鎖充當鎖,確保共享資料不會被多個執行緒同時訪問,從而避免資料損壞。條件變數用於通知執行緒特定條件已滿足,並與互斥鎖配合使用以防止執行緒繼續執行直到條件滿足。

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實作並發?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板