首頁 > 後端開發 > C++ > 主體

C++ 中如何建立和管理執行緒?有哪些線程同步機制?

王林
發布: 2024-05-07 21:03:01
原創
516 人瀏覽過

C 中的執行緒執行緒是輕量級的執行單元,可實現並發程式設計。使用 std::thread 類別建立線程,並透過互斥鎖、條件變數和自旋鎖等同步機制維護共享資料的一致性。實戰案例展示了使用線程並發計算求和的過程。

C++ 中如何创建和管理线程?有哪些线程同步机制?

C 中的執行緒建立與管理

執行緒是輕量級的執行單元,與進程共享相同位址空間,可實現並發程式設計。

建立執行緒

在C 中,使用std::thread 類別建立執行緒:

#include <thread>

void thread_function() {
  // 执行线程任务
}

int main() {
  std::thread thread(thread_function);
  thread.join();  // 阻塞主线程,直到线程执行完毕
  return 0;
}
登入後複製

執行緒同步機制

為維護執行緒之間的共享資料一致性,需要使用同步機制:

互斥鎖(Mutex)

#include <mutex>

std::mutex mutex;

void thread_function() {
  std::lock_guard<std::mutex> lock(mutex);
  // 对共享数据进行操作
}
登入後複製

條件變數(Condition Variable)

#include <condition_variable>

std::condition_variable cv;
std::mutex cv_mutex;

void thread_function() {
  std::unique_lock<std::mutex> lock(cv_mutex);
  cv.wait(lock, [] { return condition_is_met; });
  // 条件满足时,继续执行
}
登入後複製

自旋鎖(Spinlock)

#include <atomic>

std::atomic_flag spinlock = ATOMIC_FLAG_INIT;

void thread_function() {
  while (spinlock.test_and_set(std::memory_order_acquire));
  // 对共享数据进行操作
  spinlock.clear(std::memory_order_release);
}
登入後複製

實戰案例

並發計算求和

#include <thread>
#include <vector>

std::mutex sum_mutex;
long long sum = 0;

void add_numbers(const std::vector<int>& numbers) {
  for (int num : numbers) {
    std::lock_guard<std::mutex> lock(sum_mutex);
    sum += num;
  }
}

int main() {
  std::vector<std::thread> threads;
  std::vector<int> numbers = {...};  // 要相加的数字列表

  // 创建并执行线程
  for (size_t i = 0; i < std::thread::hardware_concurrency(); i++) {
    threads.emplace_back(add_numbers, numbers);
  }

  // 等待所有线程结束
  for (auto& thread : threads) {
    thread.join();
  }

  std::cout << "Sum: " << sum << std::endl;
  return 0;
}
登入後複製

以上是C++ 中如何建立和管理執行緒?有哪些線程同步機制?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!