21xrx.com
2024-12-22 22:31:36 Sunday
登录
文章检索 我的文章 写文章
C++:如何在子线程中通知主线程?
2023-07-02 02:25:13 深夜i     --     --
C++ 子线程 通知 主线程 多线程编程

在C++编程中,子线程与主线程之间的通信是非常重要的。有时,在某些情况下,主线程需要等待子线程完成某些任务后才能继续执行。为了实现此目标,可以使用线程同步技术。本文将介绍如何在子线程中通知主线程完成任务。

一种实现线程同步的方法是使用信号量机制。信号量是一种用于线程同步的计数器,通常用于控制线程对共享资源的访问。在C++中,可以使用std::condition_variable_any类来实现线程同步。

std::condition_variable_any是一个基于信号量机制的C++标准库类。它提供了两个主要的方法wait()和notify_one()。wait()方法被调用后,线程将等待直到条件变量被通知。当线程完成任务时,它可以调用notify_one()方法通知等待线程。在子线程中使用notify_one()方法通知主线程完成任务并结束子线程。

下面是一个简单的示例程序,演示如何在子线程中通知主线程完成任务。

#include

#include

#include

#include

std::mutex mtx;

std::condition_variable cv;

bool isFinished = false;

void subThread()

{

  // 子线程执行任务

  std::cout << "子线程开始执行任务..." << std::endl;

  std::this_thread::sleep_for(std::chrono::milliseconds(5000));

  std::cout << "子线程完成任务!" << std::endl;

  // 通知主线程任务已完成

  std::unique_lock lock(mtx);

  isFinished = true;

  cv.notify_one();

}

int main()

{

  // 创建子线程

  std::thread t(subThread);

  std::cout << "主线程等待子线程完成任务..." << std::endl;

  // 等待子线程完成任务

  std::unique_lock lock(mtx);

  while (!isFinished)

  {

    cv.wait(lock);

  }

  std::cout << "主线程任务已完成!" << std::endl;

  // 等待子线程结束

  t.join();

  return 0;

}

在上面的示例程序中,子线程执行任务并调用notify_one()方法通知主线程任务已完成。主线程等待子线程完成任务并调用wait()方法等待通知。当子线程调用notify_one()方法时,wait()方法将返回并允许主线程继续执行。

总之,在C++中,可以使用std::condition_variable_any类实现线程同步。在子线程中,使用notify_one()方法通知主线程完成任务,并在主线程中使用wait()方法等待通知。这种方法可以帮助我们更有效地控制线程之间的通信和同步。

  
  

评论区

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