簡體   English   中英

在C中使用緩沖區和多線程從文本文件讀取

[英]Reading from text file using buffer and multithreading in C

我正在從事的項目的一部分要求我從未知大小的文本文件中讀取並將數據放入10KB的緩沖區中。 我必須將文件分成2KB塊讀入此緩沖區。 我必須同時運行4個線程。 第一個線程執行我剛才提到的閱讀。

當線程正在將2KB的數據塊讀入緩沖區時,其他三個線程將抓取讀取器讀入的2KB數據塊並對其進行一些計算。 完成這些線程后,它們將獲取下一個2KB塊並進行相同的計算。 重復此過程,直到已讀完整個文本文件。

誰能給我一些有關如何繼續進行該項目部分的指導? 我知道如何多線程。 只是我以前從未經歷過的多線程和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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM