小工具知识网

当前位置: 首页 > 行业知识 > 消息队列的实现

行业知识

消息队列的实现

2026-11-09 03:36:43 来源:互联网转载
8.8 消息队列

队列���一种先进先出的结构,消息队列是进程(线程)常用的一种方法,实现消息队列常用的方法:

()

(1)阻塞队列 (2)无锁队列 (3)环形队列

值得注意的是:在pop 和push 一定要使用while循环,避免虚假唤醒

()
8.8.1 阻塞队列

(1)pthread

实现阻塞队列使用生产者-消费者模式,使用步骤:

#include #include //第一步,添加成员变量std::queue queue_;int max_size_;pthread_mutex_t mutex_;pthread_cond_t condition_var_;//第二步,实现push函数void Push(const T& item) {    pthread_mutex_lock(&mutex_);    while (queue_.size() >= max_size_) {        pthread_cond_wait(&condition_var_, &mutex_);    }    queue_.push(item);    pthread_cond_signal(&condition_var_);    pthread_mutex_unlock(&mutex_);}//第三步,实现pop函数 T Pop()  {     pthread_mutex_lock(&mutex_);     while (queue_.empty()) {         pthread_cond_wait(&condition_var_, &mutex_);     }     T item = queue_.front();     queue_.pop();     pthread_cond_signal(&condition_var_);     pthread_mutex_unlock(&mutex_);     return item;  }

示例代码:

#include #include template class BlockingQueue {public:    BlockingQueue() : max_size_(100) {        pthread_mutex_init(&mutex_, nullptr);        pthread_cond_init(&condition_var_, nullptr);    }    ~BlockingQueue() {        pthread_mutex_destroy(&mutex_);        pthread_cond_destroy(&condition_var_);    }    void Push(const T& item) {        pthread_mutex_lock(&mutex_);        while (queue_.size() >= max_size_) {            pthread_cond_wait(&condition_var_, &mutex_);        }        queue_.push(item);        pthread_cond_signal(&condition_var_);        pthread_mutex_unlock(&mutex_);    }    T Pop() {        pthread_mutex_lock(&mutex_);        while (queue_.empty()) {            pthread_cond_wait(&condition_var_, &mutex_);        }        T item = queue_.front();        queue_.pop();        pthread_cond_signal(&condition_var_);        pthread_mutex_unlock(&mutex_);        return item;    }private:    std::queue queue_;    int max_size_;    pthread_mutex_t mutex_;    pthread_cond_t condition_var_;};

测试代码:

#include #include #include #include BlockingQueue queue;void* ProducerThread(void* arg) {    int thread_id = *static_cast(arg);    for (int i = 1; i 

上一篇:navisworks怎么选择服务器?

下一篇:QQ手机客服代码添加指南,一键联系客服,轻松解决问题!