21xrx.com
2025-04-13 19:09:36 Sunday
文章检索 我的文章 写文章
"C++子线程如何通知主线程?"
2023-07-05 08:50:56 深夜i     18     0
C++编程 子线程 主线程 通信 通知机制

C++是一门高级编程语言,广泛应用于各种领域,尤其是在游戏开发、桌面应用程序以及系统程序中。随着计算机硬件的发展,多线程编程日益重要,有时候我们需要让子线程通知主线程某些事件的发生,本文将介绍C++子线程如何通知主线程。

一般来说,子线程和主线程是同时运行的,它们互相独立,互相不知道对方的存在。在C++中,我们可以使用互斥锁(mutex)和条件变量(condition variable)来实现线程之间的同步和通信。

互斥锁是一种保证同一时刻只能有一个线程访问共享资源的机制。条件变量用于在一个线程等待另一个线程发出信号前一直等待。这两种机制结合在一起可以实现线程之间的通信。

下面是一个简单的示例代码:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void work()
{
  // ... 做一些任务 ...
  {
    std::lock_guard<std::mutex> lk(mtx);
    ready = true;
  }
  cv.notify_one();
}
int main()
{
  std::thread t(work);
  {
    std::unique_lock<std::mutex> lk(mtx);
    cv.wait(lk, [] return ready; );
  }
  std::cout << "子线程已完成任务" << std::endl;
  t.join();
  return 0;
}

在上面的代码中,我们定义了一个互斥锁和一个条件变量。子线程中做完任务后会将ready标志设置为true,并调用cv.notify_one()来通知主线程。主线程中调用cv.wait()进入等待状态,直到ready被设置为true才会继续执行。

需要注意的是,互斥锁和条件变量必须是全局的,这样子线程和主线程才能共享它们。另外,条件变量必须与互斥锁一起使用,以确保线程同步。在使用条件变量前必须先获取互斥锁,并在发送通知前释放互斥锁。

总结一下,C++子线程可以通过条件变量通知主线程,使得主线程能够及时响应事件。互斥锁和条件变量是实现线程同步和通信的重要机制,需要合理使用。

  
  

评论区

请求出错了