【发布时间】:2019-06-18 14:11:51
【问题描述】:
我正在使用检索 I/Q 数据的 API。调用函数bbGetIQ(m_handle, &pkt);填充缓冲区。这是一个线程循环,而用户没有输入“停止”。 Pkt 是一个结构,使用的缓冲区是pkt.iqData = &m_buffer[0];,它是一个浮点向量。向量的大小是 5000,每次我们循环缓冲区时都会填充 5000 个值。
我想将缓冲区中的数据保存到一个文件中,我是在调用 bbgetIQ 之后立即执行此操作的,但这样做是一项耗时的任务,数据检索速度不够快导致 API删除数据,以便它可以继续填充其缓冲区。
这是我的代码的样子:
void Acquisition::recordIQ(){
int cpt = 0;
ofstream myfile;
while(1){
while (keep_running)
{
cpt++;
if(cpt < 2)
myfile.open ("/media/ssd/IQ_Data.txt");
bbGetIQ(m_handle, &pkt); //Retrieve I/Q data
//Writing content of buffer into the file.
for(int i=0; i<m_buffer.size(); i++)
myfile << m_buffer[i] << endl;
}
cpt = 0;
myfile.close();
}
}
然后我尝试只在我们离开循环时写入文件:
void Acquisition::recordIQ(){
int cpt = 0;
ofstream myfile;
int next=0;
vector<float> data;
while(1){
while ( keep_running)
{
if(keep_running == false){
myfile.open ("/media/ssd/IQ_Data.txt");
for(int i=0; i<data.size(); i++)
myfile << data[i] << endl;
myfile.close();
break;
}
cpt++;
data.resize(next + m_buffer.size());
bbGetIQ(m_handle, &pkt); //retrieve data
std::copy(m_buffer.begin(), m_buffer.end(), data.begin() + next); //copy content of the buffer into final vector
next += m_buffer.size(); //next index
}
cpt = 0;
}
}
我不再从 API 中丢失数据,但问题是我受到 data 向量大小的限制。例如,我不能让它整夜检索数据。
我的想法是制作 2 个线程。一个将检索数据,另一个将数据写入文件。两个线程将共享一个循环缓冲区,其中第一个线程将填充缓冲区,第二个线程将读取缓冲区并将内容写入文件。因为它是一个共享缓冲区,我想我应该使用互斥锁。
我是多线程和互斥锁的新手,所以这是个好主意吗?我真的不知道从哪里开始以及消费者线程如何在生产者填充缓冲区时读取缓冲区。读取时锁定缓冲区会导致 API 丢失数据吗? (因为它无法将其写入循环缓冲区)。
编辑:因为我希望我的记录线程在后台运行,这样我就可以在记录时做其他事情,我将其分离,用户可以通过将条件 keep_running 设置为来启动记录真的。
thread t1(&Acquisition::recordIQ, &acq);
t1.detach();
【问题讨论】:
标签: c++ multithreading mutex circular-buffer