21xrx.com
2025-03-21 16:36:10 Friday
文章检索 我的文章 写文章
"C++ 子线程如何调用主线程函数"
2023-06-29 12:36:06 深夜i     38     0
C++ 子线程 调用 主线程函数 多线程编程

在 C++ 中,多线程编程可以满足很多需要同时执行的任务。然而在多线程编程中,我们常常会遇到不同线程之间数据交互的问题。例如,在子线程中执行某个任务后,需要调用主线程的函数来更新界面或者处理相关数据。那么,C++ 子线程如何调用主线程函数呢?

在 C++ 中,主线程和子线程之间的通信最好采用消息机制。主线程用一个消息队列来存放消息,每个消息都对应着一个函数的调用。当子线程需要调用主线程函数时,它可以创建一个消息,并将这个消息放入主线程的消息队列中。主线程会不停地取出消息,并执行对应的函数调用。

具体来说,我们可以在主线程中创建一个消息队列,该队列负责存放所有的消息。当子线程需要调用主线程的函数时,它可以利用主线程的消息队列来实现。具体步骤如下:

1. 在主线程中创建一个消息队列,该队列用于存放所有的消息;

2. 在子线程中创建消息,并将这个消息放入主线程的消息队列中;

3. 主线程会不停地取出消息,并执行对应的函数调用。

可以使用以下代码来实现上述步骤:

#include <thread>
#include <condition_variable>
#include <queue>
#include <functional>
template<typename T>
class MessageQueue {
public:
  void send(T&& msg) {
    std::unique_lock<std::mutex> lock(_mutex);
    _queue.push(std::forward<T>(msg));
    _cond.notify_one();
  }
  
  T receive() {
    std::unique_lock<std::mutex> lock(_mutex);
    _cond.wait(lock, [this] { return !_queue.empty(); });
    T msg = std::move(_queue.front());
    _queue.pop();
    return msg;
  }
private:
  std::mutex _mutex;
  std::condition_variable _cond;
  std::queue<T> _queue;
};
// 主线程
int main() {
  MessageQueue<std::function<void()>> mq;
  // 创建子线程
  std::thread t([&mq]() {
    // 子线程执行的函数
    // ...
    // 通过消息队列调用主线程函数
    mq.send([]()
      // 主线程函数
    );
  });
  // 循环取出消息并调用对应的函数
  while (true) {
    auto msg = mq.receive();
    msg();
  }
  // 等待子线程结束
  t.join();
  return 0;
}

总的来说,C++ 子线程如何调用主线程函数的方法主要有两种,一种是使用 Windows API 中的 PostThreadMessage 函数,另一种是采用上述消息队列的方法。不同的方法有各自的优缺点,具体选择需要根据项目需求和开发者的经验来决定。

  
  

评论区