21xrx.com
2025-03-22 04:01:18 Saturday
文章检索 我的文章 写文章
C++线程同步:实现ID轮流打印
2023-06-24 06:47:04 深夜i     14     0
C++ 线程同步 ID 轮流打印 实现

在多线程编程中,线程同步是一个非常重要的概念。它可以确保多个线程按照预期的顺序执行,避免出现数据竞争等问题。在这篇文章中,我们将介绍如何使用C++实现线程同步,以及如何实现ID轮流打印。

首先,我们需要定义一个线程间通信的机制,常用的有信号量、互斥锁和条件变量等。在本节中,我们将使用互斥锁和条件变量来实现线程同步。

互斥锁用于保护共享数据的访问,防止多个线程同时修改它。在C++中,互斥锁的定义如下:

#include <mutex>
std::mutex mutex_;

条件变量用于在线程间传递信号,它可以使一个线程等待另一个线程的信号,从而达到同步的效果。在C++中,条件变量的定义如下:

#include <condition_variable>
std::condition_variable cv_;

接下来,我们需要定义两个线程函数,它们将在两个不同的线程中运行。这里我们使用lambda表达式来定义线程函数。

auto print_id = [](int id) {
  for (int i = 0; i < 10; ++i) {
    std::unique_lock<std::mutex> lock(mutex_);
    while (id != current_id) {
      cv_.wait(lock);
    }
    std::cout << "id: " << id << " -> " << i << std::endl;
    ++current_id;
    if (current_id > 1)
      current_id = 0;
    
    cv_.notify_all();
  }
};

在上面的代码中,我们使用了std::unique_lock 来自动管理互斥锁的加锁和解锁,避免出现遗漏的情况。同时,我们使用了while循环来等待当前ID打印完成,防止多个线程同时修改current_id的值。当线程打印完当前ID的所有数字后,我们将current_id的值加一,并使用条件变量通知另一个线程开始打印。

最后,我们只需要创建两个线程并启动它们即可。

std::thread t1(print_id, 0);
std::thread t2(print_id, 1);
t1.join();
t2.join();

完整的代码实现如下:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mutex_;
std::condition_variable cv_;
int current_id = 0;
auto print_id = [](int id) {
  for (int i = 0; i < 10; ++i) {
    std::unique_lock<std::mutex> lock(mutex_);
    while (id != current_id) {
      cv_.wait(lock);
    }
    std::cout << "id: " << id << " -> " << i << std::endl;
    ++current_id;
    if (current_id > 1)
      current_id = 0;
    
    cv_.notify_all();
  }
};
int main() {
  std::thread t1(print_id, 0);
  std::thread t2(print_id, 1);
  t1.join();
  t2.join();
  return 0;
}

运行上面的代码,我们可以看到两个线程交替输出ID和数字,符合我们所期望的结果。

总结

本篇文章介绍了如何使用C++实现线程同步,以及如何实现ID轮流打印。使用互斥锁和条件变量可以防止多个线程同时访问共享数据,达到线程同步的效果。如果您在多线程编程中遇到了问题,可以考虑使用本文介绍的技术实现线程同步。

  
  

评论区

请求出错了