【问题标题】:Reading from text file using buffer and multithreading in C在 C 中使用缓冲区和多线程从文本文件中读取
【发布时间】:2012-04-24 23:15:48
【问题描述】:

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

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

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

【问题讨论】:

  • 当你说“我知道如何多线程”时,你是否熟悉条件变量?
  • 三个线程能否分别在 2K 块的 1/3 上独立工作?如果没有,就会有很大的争论。
  • 如果三个线程使用缓冲区中的数据只读取数据,则不会发生争用。
  • 如果使用缓冲区中数据的三个线程只读取数据,那么我的问题将变为“输出到哪里去?”

标签: c multithreading file-io buffer


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    相关资源
    最近更新 更多