holyya.com
2025-10-27 00:01:29 Monday
登录
文章检索 我的文章 写文章
"C++子线程如何通知主线程?"
2023-07-05 08:50:56 深夜i     --     --
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++子线程可以通过条件变量通知主线程,使得主线程能够及时响应事件。互斥锁和条件变量是实现线程同步和通信的重要机制,需要合理使用。

  
  

评论区

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