簡體   English   中英

Cat Unix命令多線程實現

[英]Cat unix command multithread implementation

嗨,我正在嘗試實施比提供的更快的cat。

我當前的實現如下所示:

#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#define BUF_SIZE 1024*1024*1024

char buffer[BUF_SIZE];
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_var = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond_var2 = PTHREAD_COND_INITIALIZER;
int readed = 0;
/*
    Read characters from standard input and saves them to buffer
*/
void *consumer(void *data) {
    int r;
    while(1) {
        //---------CRITICAL CODE--------------
        //------------REGION------------------
        pthread_mutex_lock(&mutex);
        if (readed > 0)
        {
            pthread_cond_wait(&cond_var2, &mutex);
        }
        r = read(0, buffer, BUF_SIZE);
        readed = r;

        pthread_cond_signal(&cond_var);
        pthread_mutex_unlock(&mutex);
        //------------------------------------

        if (r == -1){
            printf("Error reading\n");
        }  
        else if (r == 0) {
            pthread_exit(NULL);
        }
    }
}

/*
    Print chars readed by consumer from standard input to standard output
*/
void *out_producer(void *data) {
    int w;
    while(1){    
        //---------CRITICAL CODE--------------
        //-------------REGION-----------------
        pthread_mutex_lock(&mutex);
        if (readed == 0)
        {
            pthread_cond_wait(&cond_var, &mutex);
        }
        w = write(1, buffer, readed); 
        readed = 0;
        pthread_cond_signal(&cond_var2);
        pthread_mutex_unlock(&mutex);
        //------------------------------------ 

        if (w == -1){
            printf("Error writing\n");
        } 
        else if (w == 0) {
            pthread_exit(NULL);
        }
    }
}

您會提出什么建議以使其更快? 有任何想法嗎? 我在考慮BUF_SIZE,您認為最佳緩沖區大小是什么?

Main只是使線程:

int main() {
    //  Program RETURN value
    int return_value = 0;

    //  in - INPUT thread
    //  out - OUTPUT thread
    pthread_t in, out;

    //  Creating in thread - should read from standard input (0)
    return_value = pthread_create(&in , NULL, consumer, NULL);
    if (return_value != 0) {
        printf("Error creating input thread exiting with code error: %d\n", return_value);
        return return_value;
    }

    //  Creating out thread - should write to standard output (1)
    return_value = pthread_create(&out, NULL, out_producer, NULL);
    if (return_value != 0) {
        printf("Error creating output thread exiting with code error: %d\n", return_value);
        return return_value;
    }

    return_value = pthread_join(in, NULL);
    return_value = pthread_join(out, NULL);

    return return_value;
}

cat添加線程的精確度如何使其更快? 您不能只是在任何程序上拋出並行性,並期望它運行得更快。

Cat基本上只是將輸入的每一行(通常是從文件中)傳輸到輸出。 由於線條的順序很重要,因此必須使用互斥來避免競爭。

並行速度的上限( cat可以運行的最快速度)不能高於串行的cat ,因為每個線程都必須執行串行操作以及同步的開銷。

暫無
暫無

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

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