为应对系统的通信上消息收发的高耦合度,在接受和发送消息后设计一个缓存队列,并使用多线程生产者-消费者来进行收发解耦。避免通信上的拥堵情况。
利用C++内置函数实现生产者-消费者功能:
private:
std::deque<T> queue_; //缓存队列
size_t size_limit_; //缓存队列大小的限制
std::mutex lock_; //互斥锁
std::condition_variable empty_, full_; //并发条件变量类
std::atomic<int> producer_num_; //生产者数量
实现思路是:当缓存队列满的时候,生产者将被挂起,直到队列重新拥有空间。但缓存队列为空时,消费者线程将被挂起,直到有“商品”被放入队列之中。
void Productor(T& item) {
{
std::unique_lock<std::mutex> lk(lock_); //加锁防止冲突
while (queue_.size() >= size_limit_) {
full_.wait(lk);
}
queue_.emplace_back(item);
}
empty_.notify_one();
}
full_.wait(lk)
在queue队列满时将会把Productor挂起,直到queue有空间放入新的item。notify_one
方法任意从WAITTING状态的线程中挑选一个进行通知,使得调用wait()方法的线程从等待队列移入到同步队列中,等待有机会再一次获取到锁,从而使得调用wait()方法的线程能够从wait()方法处退出。
bool Consumer(T& item) {
{
std::unique_lock<std::mutex> lk(lock_);
while (queue_.empty() && (producer_num_ != 0)) {
empty_.wait(lk);
}
if (queue_.empty() && (producer_num_ == 0)) {
return false;
} else {
item = std::move(queue_.front());
queue_.pop_front();
full_.notify_one();
return true;
}
}
}
同理,empty_.wait(lk)
会在生产者数量为0或者队列queue为空的时候,将Consumer挂起。直到有商品进入到队列中。这样就可以实现一个简单的生产者消费者。