关于环形缓冲区

时间:2019-08-31 14:10:02

标签: c++ buffer ring

我必须创建一个具有并行进程的系统,该进程将使用环形缓冲区。“ dad”进程当然必须创建信号量并进行分段并启动其儿子,然后他可以撤退并等待其他人完成。创建一个从键盘读取字符并将其写入环形缓冲区的进程,创建一个生成文本并放入环形缓冲区的进程,并创建一个从环形缓冲区读取并在屏幕上写入的进程。所有必需的资源都必须同步(当然)。

到目前为止,我已经尝试过了,但是该程序无法正常工作。有谁可以帮助我解决这个问题。

这是.h文件:

 template<typename T>
class RingBuffer
{
private:
    T* _value;
    int size;  
    int front;
    int back;
    bool empty;

public:
    RingBuffer(int s);
    ~RingBuffer();
    void _add(T element);
    T get();
    void _write(RingBuffer *_value);
    void _read(RingBuffer *_value);
    bool is_empty();
    int get_size();
};

Here is .cpp file:

#include "RingBuffer.h"
#include <iostream>


template<typename T>
RingBuffer<T>::RingBuffer(int s)
    :size(s)
{
    _value = new T[size];
}

template<typename T>
RingBuffer<T>::~RingBuffer()
{
    if (_value!= nullptr)
    {
        delete[] _value;
    }
}

template<typename T>
void RingBuffer<T>::_add(T element)
{
    if (back == front & !empty)
    {
        return;
    }
    _value[back] = element;
    _value[back] = (back + 1) % size;
    empty = false;
}

template<typename T>
T RingBuffer<T>::get()
{
    if (back == front && empty)     

    {
        return 0;
    }
    int return_value = _value[front];
    front = (front + 1) % size;

    if (front == back)
        empty = true;
    return true;
}

template<typename T>
void RingBuffer<T>::_read(RingBuffer *_value)
{
    while (true)
    {
        std::cout << _value->get();
    }
}

template<typename T>
void RingBuffer<T>::_write(RingBuffer* _value)
{
    while (true)
    {
        std::string s;
        std::getline(std::cin,  s);
        for (int i = 0; i < s.size(); i++)
        {
            _value->_add(s[i]);
        }
        std::cout << std::endl;
    }
}


template<typename T>
int RingBuffer<T>::get_size()
{
    return size;
}

template<typename T>
bool RingBuffer<T>::is_empty()
{
    if (back == 0)
        return true;
    else
        return false;
}

Here is main function:
#include <iostream>
#include <thread>
#include <string>

#include "RingBuffer.h"

int main(){
int write = 0;
int read = 0;
    RingBuffer<std::string> _value(10);
    std::thread key(write, &_value);
    std::thread reader(read, &_value);
    key.join();
    reader.join();

    system("pause");
    return 0;
}

这两个是get()函数中的错误。

// C2672'std :: invoke':找不到匹配的重载函数

//错误C2893无法专用于功能模板'unknown-type std :: invoke(_Callable &&,_ Types && ...)// noexcept()'

1 个答案:

答案 0 :(得分:0)

.cpp文件中不能包含模板定义。

查看here(更适合您的问题)或here以获得更多信息。