卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章53316本站已运行3121

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

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;
}
卓越飞翔博客
上一篇: Golang技术中分布式系统调试技巧有哪些?
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏