3 Star 2 Fork 3

四月是你的谎言/深入应用C++11:代码优化与工程级应用 的实践代码

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
5-5.cpp 2.59 KB
一键复制 编辑 原始数据 按行查看 历史
#include <thread>
#include <iostream>
#include <mutex>
#include <condition_variable>
#include <list>
using std::cout;
using std::endl;
template<typename T>
class SyncQueue{
bool IsFull() const
{
return m_queue.size() == m_maxSize;
}
bool IsEmpty() const
{
return m_queue.empty();
}
public:
SyncQueue(int maxSize) :m_maxSize(maxSize) {}
void Put(const T &x)
{
std::lock_guard<std::mutex> locker(m_mutex); // 保护; 控制 卫兵
while(IsFull())
{
cout << "缓冲区满了, 需要等待" << endl;
m_notFull.wait(m_mutex);
}
m_queue.push_back(x);
m_notEmpty.notify_one();
}
void Take(T &x)
{
std::lock_guard<std::mutex> locket(m_mutex);
while(IsEmpty())
{
cout << "缓冲区空了,需要等待" << endl;
m_notEmpty.wait(m_mutex);
}
x = m_queue.front();
m_queue.pop_front();
m_notFull.notify_one();
}
bool Empty()
{
std::lock_guard<std::mutex> locker(m_mutex);
return m_queue.empty();
}
bool Full()
{
std::lock_guard<std::mutex> locker(m_mutex);
return m_queue.size() == m_maxSize;
}
size_t Size()
{
std::lock_guard<std::mutex> locker(m_mutex);
return m_queue.size();
}
int Count()
{
return m_queue.size();
}
private:
std::list<T> m_queue; //缓冲区
std::mutex m_mutex; //互斥量
std::condition_variable_any m_notEmpty; //不为空的条件变量
std::condition_variable_any m_notFull; //没有满的条件变量 //等会儿在写一下官方的例子
int m_maxSize; //同步队列最大的size
};
SyncQueue<int> queue(10);
void fun1() //消费者
{
cout << "吃货1: " << std::this_thread::get_id() << endl;
int x = 0;
while(x != 10) { //吃到10 算我输
queue.Take(x);
cout << " | 吃到了 :" << x ;
//要延时一下
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
cout << "bye" << std::this_thread::get_id()<< endl;
}
void fun2() //生产者
{
cout << "产货1: " << std::this_thread::get_id()<< endl;;
int x = 0;
while (! queue.Full())
{
std::this_thread::sleep_for(std::chrono::milliseconds(100));
queue.Put(x++);
cout << "| 产出 :" << x;
}
cout << "bye" << std::this_thread::get_id()<< endl;
}
void fun(){}
int main(void)
{
SyncQueue<int> queue(10);
std::thread t1(fun1);
std::thread t2(fun2);
t1.join();
t2.join();
return 0;
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/HeLiangMsg/c11_book_learned_code.git
[email protected]:HeLiangMsg/c11_book_learned_code.git
HeLiangMsg
c11_book_learned_code
深入应用C++11:代码优化与工程级应用 的实践代码
master

搜索帮助