21xrx.com
2024-11-08 21:12:55 Friday
登录
文章检索 我的文章 写文章
C++线程同步:实现ID轮流打印
2023-06-24 06:47:04 深夜i     --     --
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轮流打印。使用互斥锁和条件变量可以防止多个线程同时访问共享数据,达到线程同步的效果。如果您在多线程编程中遇到了问题,可以考虑使用本文介绍的技术实现线程同步。

  
  

评论区

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