21xrx.com
2024-12-22 21:54:15 Sunday
登录
文章检索 我的文章 写文章
C++中实现线程之间的同步
2023-07-07 21:04:07 深夜i     --     --
C++ 线程 同步 互斥量 条件变量

在 C++ 编程中,线程的同步是不可或缺的一部分。线程之间的同步,指的是在多个线程同时执行的过程中,为了保证程序的正确性和稳定性,需要对不同线程之间的运行顺序和共享资源的访问进行协调和管理。下面是 C++ 中实现线程之间同步的几种方式:

1. 互斥锁(Mutex)

互斥锁是一种非常常见的线程同步方式,它可以确保共享资源在同一时间只能被一个线程访问。C++ 中提供了 std::mutex 类来实现互斥锁,我们可以使用 std::lock_guard 或者 std::unique_lock 对共享资源进行加锁和解锁操作。

示例代码:


#include <iostream>

#include <thread>

#include <mutex>

std::mutex mtx;

void print_thread_id(int id) {

  std::lock_guard<std::mutex> lock(mtx);

  std::cout << "Thread " << id << " started" << std::endl;

}

int main () {

  std::thread threads[10];

  for (int i = 0; i < 10; ++i) {

    threads[i] = std::thread(print_thread_id, i);

  }

  for (auto& thread : threads) {

    thread.join();

  }

  return 0;

}

2. 条件变量(Condition Variables)

条件变量是一种线程同步技术,它可以确保在某个条件满足时,线程可以等待、唤醒或者阻塞。C++ 中提供了 std::condition_variable 类来实现条件变量,我们可以使用它和互斥锁一起工作来确保线程同步。

示例代码:


#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

std::mutex mtx;

std::condition_variable cv;

bool isReady = false;

void print_thread_id(int id) {

  std::unique_lock<std::mutex> lock(mtx);

  cv.wait(lock, [] return isReady; );

  std::cout << "Thread " << id << " started" << std::endl;

}

void set_ready() {

  std::unique_lock<std::mutex> lock(mtx);

  isReady = true;

  cv.notify_all();

}

int main () {

  std::thread threads[10];

  for (int i = 0; i < 10; ++i) {

    threads[i] = std::thread(print_thread_id, i);

  }

  // Do some work here

  set_ready();

  for (auto& thread : threads) {

    thread.join();

  }

  return 0;

}

3. 原子操作(Atomic Operations)

原子操作是一种线程同步技术,它可以确保多个线程对同一共享变量进行读写操作时,不会出现不一致的结果。C++ 中提供了 std::atomic 类来实现原子操作,我们可以使用它来确保线程同步。

示例代码:


#include <iostream>

#include <thread>

#include <atomic>

std::atomic<int> counter(0);

void increment_counter() {

  for (int i = 0; i < 100; ++i) {

    ++counter;

  }

}

int main () {

  std::thread threads[10];

  for (int i = 0; i < 10; ++i) {

    threads[i] = std::thread(increment_counter);

  }

  for (auto& thread : threads) {

    thread.join();

  }

  std::cout << "Counter value: " << counter << std::endl;

  return 0;

}

以上就是 C++ 中实现线程之间同步的几种方式。在多线程编程中,我们必须谨慎处理线程之间的同步问题,以确保程序的正确性和稳定性。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复