我必须创建一个具有并行进程的系统,该进程将使用环形缓冲区。“ 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()'