当前位置:网站首页>LeetCode-1188. 设计有限阻塞队列
LeetCode-1188. 设计有限阻塞队列
2022-06-29 14:49:00 【边界流浪者】
实现一个拥有如下方法的线程安全有限阻塞队列:
BoundedBlockingQueue(int capacity) 构造方法初始化队列,其中capacity代表队列长度上限。
void enqueue(int element) 在队首增加一个element. 如果队列满,调用线程被阻塞直到队列非满。
int dequeue() 返回队尾元素并从队列中将其删除. 如果队列为空,调用线程被阻塞直到队列非空。
int size() 返回当前队列元素个数。
你的实现将会被多线程同时访问进行测试。每一个线程要么是一个只调用enqueue方法的生产者线程,要么是一个只调用dequeue方法的消费者线程。size方法将会在每一个测试用例之后进行调用。
请不要使用内置的有限阻塞队列实现,否则面试将不会通过。
示例 1:
输入:
1
1
["BoundedBlockingQueue","enqueue","dequeue","dequeue","enqueue","enqueue","enqueue","enqueue","dequeue"]
[[2],[1],[],[],[0],[2],[3],[4],[]]
输出:
[1,0,2,2]
解释:
生产者线程数目 = 1
消费者线程数目 = 1
BoundedBlockingQueue queue = new BoundedBlockingQueue(2); // 使用capacity = 2初始化队列。
queue.enqueue(1); // 生产者线程将 1 插入队列。
queue.dequeue(); // 消费者线程调用 dequeue 并返回 1 。
queue.dequeue(); // 由于队列为空,消费者线程被阻塞。
queue.enqueue(0); // 生产者线程将 0 插入队列。消费者线程被解除阻塞同时将 0 弹出队列并返回。
queue.enqueue(2); // 生产者线程将 2 插入队列。
queue.enqueue(3); // 生产者线程将 3 插入队列。
queue.enqueue(4); // 生产者线程由于队列长度已达到上限 2 而被阻塞。
queue.dequeue(); // 消费者线程将 2 从队列弹出并返回。生产者线程解除阻塞同时将4插入队列。
queue.size(); // 队列中还有 2 个元素。size()方法在每组测试用例最后调用。
示例 2:
输入:
3
4
["BoundedBlockingQueue","enqueue","enqueue","enqueue","dequeue","dequeue","dequeue","enqueue"]
[[3],[1],[0],[2],[],[],[],[3]]
输出:
[1,0,2,1]
解释:
生产者线程数目 = 3
消费者线程数目 = 4
BoundedBlockingQueue queue = new BoundedBlockingQueue(3); // 使用capacity = 3初始化队列。
queue.enqueue(1); // 生产者线程 P1 将 1 插入队列。
queue.enqueue(0); // 生产者线程 P2 将 0 插入队列。
queue.enqueue(2); // 生产者线程 P3 将2插入队列。
queue.dequeue(); // 消费者线程 C1 调用 dequeue。
queue.dequeue(); // 消费者线程 C2 调用 dequeue。
queue.dequeue(); // 消费者线程 C3 调用 dequeue。
queue.enqueue(3); // 其中一个生产者线程将3插入队列。
queue.size(); // 队列中还有 1 个元素。
由于生产者/消费者线程的数目可能大于 1 ,我们并不知道线程如何被操作系统调度,即使输入看上去隐含了顺序。因此任意一种输出[1,0,2]或[1,2,0]或[0,1,2]或[0,2,1]或[2,0,1]或[2,1,0]都可被接受。
提示:
1 <= Number of Prdoucers <= 8
1 <= Number of Consumers <= 8
1 <= size <= 30
0 <= element <= 20
enqueue的调用次数 大于等于 dequeue 的调用次数。
enque, deque 和 size 最多被调用 40 次
#include <iostream>
#include <queue>
#include <mutex>
#include <condition_variable>
using namespace std;
class BoundedBlockingQueue {
public:
BoundedBlockingQueue(int capacity) {
cap = capacity;
}
void enqueue(int element) {
std::unique_lock<mutex> uq(mtx);
/* 队列已满,等待 */
cv.wait(uq, [=]() {
return (m_q.size() < cap);
});
m_q.push(element);
cv.notify_one();
}
int dequeue() {
std::unique_lock<mutex> uq(mtx);
/* 队列为空,等待 */
cv.wait(uq, [=]() {
return (!m_q.empty());
});
int ret = m_q.front();
m_q.pop();
cv.notify_one();
return ret;
}
int size() {
std::unique_lock<mutex> uq(mtx);
return m_q.size();
}
private:
int cap;
condition_variable cv;
mutex mtx;
queue<int> m_q;
};边栏推荐
- Unity C basic review 27 - delegation example (p448)
- Differential equations of satellite motion
- China arsenic trioxide industry research and future forecast report (2022 Edition)
- 阿尔兹海默病智能诊断
- message from server: “Host ‘xxxxxx‘ is blocked because of many connection errors; unblock with ‘m
- Jet hydrogen technology rushes to the scientific innovation board: SAIC Group is the major shareholder to raise 1.06 billion yuan
- curl: (56) Recv failure: Connection reset by peer
- mysql 备份与还原
- 获取Text组件内容的宽度
- 模电 2个NPN管组成的恒流源电路分析
猜你喜欢

卫星运动的微分方程

Construction and application of medical field Atlas of dingxiangyuan
![[Verilog quick start of Niuke online question series] ~ shift operation and multiplication](/img/ea/457abb2ad0d39ffe4b235576c49a8f.png)
[Verilog quick start of Niuke online question series] ~ shift operation and multiplication

Slow bear market, bit Store provides stable stacking products to help you cross the bull and bear

Wechat official account - menu

Illustration of Ctrip quarterly report: net revenue of RMB 4.1 billion has been "halved" compared with that before the outbreak

Jet hydrogen technology rushes to the scientific innovation board: SAIC Group is the major shareholder to raise 1.06 billion yuan

Real software testers = "half product + Half development"?

Lumiprobe 脱氧核糖核酸丨磷酸盐 CPG 1000 固体载体

synchronized 与多线程的哪些关系
随机推荐
Lumiprobe reactive dye miscellaneous dye: BDP FL ceramide
Informatics Olympiad all in one 1003: aligned output
微信公众号—菜单
中国软冰淇淋市场预测与投资前景研究报告(2022版)
Intelligent diagnosis of Alzheimer's disease
BioVendor游离轻链(κ和λ)Elisa 试剂盒的化学性质
墨滴排版
mysql 备份与还原
ROS 笔记(10)— launch 文件启动
Wei long updated the prospectus: the annual revenue of 4.8 billion founder liuweiping has a strong family color
How word automatically generates directories
Ink drop typesetting
中国三氧化二砷行业研究与未来预测报告(2022版)
两个字的名字如何变成有空格的3个字符的名字
MCS:多元随机变量——多项式分布
Render follows, encapsulating a form and adding data to the table
重磅!2022最新SCI影响因子发布,三大名刊NCS及国内期刊TOP10排名有变化 (内附2022年最新影响因子)
MCS:离散随机变量——Hyper Geometric分布
Basic use of text preprocessing library Spacy (quick start)
Whitelabel error page access