我正在处理的项目的一部分要求我从未知大小的文本文件中读取并将数据放入10KB缓冲区。我必须以2KB块的形式将文件读入此缓冲区。我必须同时运行4个线程。第一个线程执行我刚才提到的读数。
当线程将2KB数据块读入缓冲区时,其他三个线程抓取读取器读入的2KB块并对其进行一些计算。完成这些线程后,它们会获取下一个2KB块并执行相同的计算。重复此过程,直到读完整个文本文件。
有人可以就如何进行这部分项目给我一些指导吗?我知道如何多线程。它只是多线程和I / O的组合,我以前没有经验。我之前只做过简单的I / O.
答案 0 :(得分:0)
一个简单的机制可能是为10K缓冲区提供共享的“高水位线”。读取文件的线程(I / O线程)将在适当的位置更新它,“消费者”线程将读取它。它将受互斥锁保护,当I / O线程更新它时,它将发出一个条件变量信号。只允许I / O线程写入该变量(同时持有互斥锁)和10KB缓冲区 - 允许其他线程读取该变量(同时持有互斥锁)并且可以从缓冲区读取 - 但仅限于由高水位线指示的点。
一些非常粗略的伪代码(填写你自己的错误处理,检查完成,初始化等):
pthread_mutex_t mux;
pthread_cond_var_t valid_bytes_updated;
int g_valid_bytes = 0; // high water mark
char buffer[10 * 1024];
void* io_thread(...)
{
int offset = 0;
while (!done) {
// read the next block of data
readdata( file_handle, &buffer[offset], 2 * 1024);
// let consumer threads know there's more data
offset += 2 * 1024;
pthread_mutex_lock( &mux);
g_valid_bytes = offset;
pthread_mutex_unlock( &mux);
pthread_cond_broadcast( &updated);
}
void* consumer_thread(...)
{
int processed_bytes = 0;
while (!done) {
// wait until there's something to do
pthread_mutex_lock( &mux);
while (processed_bytes == g_valid_bytes) {
pthread_cond_wait( &valid_bytes_updated, &mux);
}
int valid_bytes = g_valid_bytes;
pthread_mutex_unlock( &mux);
// process the data in range &buffer[processed_bytes] to &buffer[valid_bytes],
// keeping in mind that the range is up to but not including the byte at
// &buffer[valid_bytes]
processed_bytes = valid_bytes;
}
}