Блокировка Mutex ha sh карта снижает производительность - PullRequest
0 голосов
/ 28 марта 2020

У меня есть программа, написанная на C для подсчета частот слов в файле, используя несколько потоков. Я ожидаю, что программа будет работать быстрее при добавлении потоков, но при добавлении потоков производительность снижается. Я отладил проблему вплоть до блокировки мьютекса в секции кода ha sh моего кода, единственной общей переменной, которую я использую. Как правильно использовать замки для обеспечения лучшей производительности?

//Tokenize file contents
char **tokens=tokenizeFileContents(fileContent);

//Loop to iterate over all tokens and store frequencies
while(1){
    if(tokens[index]==NULL){
        break;
    }
    char * token=tokens[index];


    pthread_mutex_lock(&hashTable_mutex);
    if(ht_get(ht,token)==NULL){

        ht_set(ht,token,"1");

        pthread_mutex_unlock(&hashTable_mutex);
    }

    else{
        pthread_mutex_unlock(&hashTable_mutex);
        pthread_mutex_lock(&hashTable_write_mutex);
        int count=atoi(ht_get(ht,token))+1;
        char buf[32];
        snprintf(buf, sizeof(buf), "%d", count);
        ht_set(ht,token,buf);
        pthread_mutex_unlock(&hashTable_write_mutex);
    }
    index++;
}

1 Ответ

2 голосов
/ 28 марта 2020

Как правильно использовать блокировки, чтобы обеспечить лучшую производительность?

В вашей конкретной задаче для каждого потока наиболее эффективно заполнить собственную карту ha sh без блокировка мьютекса. Когда потоки завершены, объедините их таблицы ha sh в одну (суммируйте значения для сопоставления ключей карты ha sh).

Вы также можете разделить свои входные данные, чтобы дать каждому потоку свою собственную порция, чтобы они не конкурировали за чтение следующего элемента из входных данных.

...