我接受了采访,他要求我使用环形缓冲区(Circular buffer)为单个生产者和单个消费者编写代码。 我为此做了以下代码,但他对此代码根本不满意。 你们都可以扔掉我的代码并告诉我它有哪些漏洞以及我可以进行哪些改进已经做了什么将是最好/最优化的代码?
#include<iostream>
#include<thread>
#include<mutex>
#include<condition_variable>
#include<atomic>
template<typename T, int N>
class queue{
private:
T arr[N];
std::atomic<int> diff{1};
int producer{0};
int consumer{0};
std::mutex mut;
std::condition_variable cv;
public:
void push(const T& a){
while(diff==N)
std::this_thread::yield();
arr[producer] = a;
producer = (producer+1)%N;
diff++;
}
T pop(){
while(diff==0)
std::this_thread::yield();
consumer = (consumer+1)%N;
diff--;
return arr[(consumer - 1 + N)%N];
}
};
据我了解,我没有使用任何互斥锁。它是仅适用于 SPSC 的无锁代码。只是在满足边缘条件时让我的线程屈服/睡眠。 我还可以做些什么来使其更加优化
我尝试优化代码。我原以为看了这段代码后面试会很高兴,但他没有。
你问问题之前没有回答自己的问题吗?! 伙计,哦,伙计!你一定很紧张,你给了他多么好的回应,多么好的代码......
在这里, 在你的问题中你写道,“他要求我使用环形缓冲区(循环缓冲区)为单个生产者和单个消费者编写代码......”。
那么,他想要一个快速的环形缓冲区实现,你给他写了一个 linked_list 实现吗?