c - 使用 C 中的缓冲区和多线程从文本文件读取

标签 c multithreading file-io buffer

我正在从事的一个项目的一部分要求我从未知大小的文本文件中读取数据并将数据放入 10KB 缓冲区中。我必须以 2KB block 的形式将文件读入此缓冲区。我必须有 4 个线程同时运行。第一个线程执行我刚才提到的阅读。

当线程将 2KB 数据 block 读入缓冲区时,其他三个线程会抓取读取器读入的 2KB 数据 block 并对其进行一些计算。一旦这些线程完成,它们就会抓取下一个 2KB block 并执行相同的计算。重复此操作,直到读完整个文本文件。

任何人都可以给我一些关于如何继续该项目的这一部分的指导吗?我知道如何多线程。它只是多线程和I/O的结合,我以前没有体验过。我之前只做过简单的I/O。

最佳答案

一种简单的机制可能是为 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;
    }
}

关于c - 使用 C 中的缓冲区和多线程从文本文件读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10307302/

相关文章:

c - 我真的不知道为什么移位在一种情况下有效,但在另一种情况下无效

javascript - 在多线程应用程序的 spidermonkey 中嵌入 javascript 代码

.net - 在不使用大量内存的情况下显示大文件的最佳方法是什么?

c++ - 使用 getline 在运行时获取与文件输入相关的错误

c# - 简单的线程问题,锁定对共享资源或整个功能的访问?

c - C中未知数量字符串的文件IO

c - 宏定义格式错误的宏

c - 地址上的二维 float 组

c - 使用另一个函数中定义的变量

java - 在 Spring 中克隆现有的 ApplicationContext