21xrx.com
2024-11-22 06:15:32 Friday
登录
文章检索 我的文章 写文章
C++ 多线程消息队列实现
2023-07-12 08:22:03 深夜i     --     --
C++ 多线程 消息队列 实现 并发编程

C++是一门支持多线程编程的语言,具有性能优良和代码复用易等特点。多线程编程是现代程序设计的重要组成部分,能够提高程序运行效率,同时保证程序运行的稳定性。而在多线程编程中,消息队列的使用也具有非常重要的作用。本篇文章介绍C++多线程消息队列的实现。

什么是消息队列?

消息队列是一种用来在多个线程之间传递消息的机制,它允许发送者将一条消息发送到队列中,而不需要立即处理该消息。接收者可以从队列中取出消息,并将其作为输入进行处理。

消息队列具有以下特点:

1. 允许多个线程同时发送和接收消息。

2. 进入队列的消息在被处理之前可以被保留。

3. 发送者和接收者可以在不知道彼此存在的情况下使用队列。

4. 消息队列的大小可以设置为有限或无限。

实现多线程消息队列的步骤

1. 定义消息结构体

首先,我们需要定义一个消息结构体,该结构体要包含发送消息的线程id,消息类型和消息内容等信息。

例如:

struct Message

  int senderId;

  int msgType;

  std::string msgContent;

;

2. 编写消息队列类

接下来,我们需要编写一个消息队列类,该类用来存储消息,接收和发送消息。

例如:

class MessageQueue {

 public:

  MessageQueue();

  ~MessageQueue();

  void Push(const Message& msg);

  bool Pop(Message& msg);

  int Size();

 private:

  std::queue m_queue;

  std::mutex m_mutex;

  std::condition_variable m_condition;

};

其中Push()方法用来添加消息到队列中,Pop()方法用来从队列中取出消息,Size()方法用来返回队列中消息的数量。

3. 实现消息队列的Push()和Pop()方法

Push()方法实现:

void MessageQueue::Push(const Message& msg) {

  std::lock_guard lock(m_mutex);

  m_queue.push(msg);

  m_condition.notify_one();

}

该方法使用了std::lock_guard来锁定线程,保证队列的原子性。在添加消息到队列后,通过m_condition.notify_one()来通知等待在条件变量上的线程。

Pop()方法实现:

bool MessageQueue::Pop(Message& msg) {

  std::unique_lock lock(m_mutex);

  while (m_queue.empty()) {

    m_condition.wait(lock);

  }

  msg = m_queue.front();

  m_queue.pop();

  return true;

}

该方法首先使用了std::unique_lock来锁定线程,并在while循环中等待消息队列非空。当队列不为空时,通过m_queue.front()获取队列中的消息,并将其从队列中删除。

4. 使用多线程发送和接收消息

最后,我们可以使用多线程来发送和接收消息,以完成消息队列的功能。

例如:

void Sender(MessageQueue& mq, int senderId) {

  for (int i = 0; i < 10; i++) {

    Message msg;

    msg.senderId = senderId;

    msg.msgType = i;

    msg.msgContent = "message " + std::to_string(i);

    mq.Push(msg);

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

  }

}

void Receiver(MessageQueue& mq, int receiverId) {

  while (true) {

    Message msg;

    if (mq.Pop(msg))

      std::cout << "receiver " << receiverId << " received message: "

           << msg.msgContent << std::endl;

  }

}

该示例代码中,Sender函数使用了消息队列的Push()方法来发送消息,Receiver函数使用了消息队列的Pop()方法来接收消息。

总结

C++多线程消息队列是一种非常强大的多线程编程方式。通过消息队列,我们可以将不同线程间的消息传递分离开来,从而避免了竞争,提高了程序的健壮性和可维护性。通过本文介绍的实现步骤,希望能够帮助读者更好地理解消息队列的作用和实现方式,并在实际项目中成功应用多线程消息队列,提高程序的效率和可靠性。

  
  

评论区

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