Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Производительность и ресурсоемкость мьютексов


Автор: REZiaMIX 26.8.2010, 09:43
Кто что может сказать о производительности мьютексов? Какое максимальное кол-во мьютексов рекомендуется для программы?
http://forum.vingrad.ru/index.php?showtopic=280440&view=findpost&p=2023850 написано решение для безопасного удаления клиента из списка, при работе из нескольких потоков. В коде Start используется вызов LockCriticalSection(). Тут вопрос - какую критическую секцию(в линухе мьютекс) блокировать? Блокировать секцию, которая отвечает за синхронизацию доступа ко всему массиву - кажется очень накладно. Делать по мьютексу для каждого клиента?

Автор: REZiaMIX 26.8.2010, 11:17
Провел небольшой тест:
Код

Count: 2000000
All mutexes created in 556 ms; 0.000278 ms per mutex
All mutexes locked in 114 ms; 0.000057 ms per mutex
All mutexes unlocked in 102 ms; 0.000051 ms per mutex


Потребление памяти для такого кол-ва маленькое. Выходит: по мьютексу на клиента - не так уже и плохо?

Автор: boostcoder 26.8.2010, 12:00
REZiaMIX, ты бы еще код показал, и тебе бы цены небыло smile 

Автор: REZiaMIX 26.8.2010, 12:09
Цитата(boostcoder @ 26.8.2010,  12:00)
REZiaMIX, ты бы еще код показал, и тебе бы цены небыло smile

Код

    timers::msTimer timer;
    unsigned long mcount = 2000000;
    std::vector <criticalSection *> sections;

    printf("Count: %i\n",mcount);

    timer.timer();
    for(size_t i=0;i!= mcount;++i)
        sections.push_back(new criticalSection);
    unsigned long time_create = timer.getValue();
    float permutex = float(time_create) / float(mcount);
    printf("All mutexes created in %d ms; %f ms per mutex\n",time_create,permutex);

    timer.timer();
    for(size_t i=0;i!= mcount;++i)
        sections[i]->enter();
    unsigned long time_lock = timer.getValue();
    permutex = float(time_lock) / float(mcount);
    printf("All mutexes locked in %d ms; %f ms per mutex\n",time_lock,permutex);

    timer.timer();
    for(size_t i=0;i!= mcount;++i)
        sections[i]->leave();
    unsigned long time_unlock = timer.getValue();
    permutex = float(time_unlock) / (mcount);
    printf("All mutexes unlocked in %d ms; %f ms per mutex\n",time_unlock,permutex);




Где criticalSection:
Код

criticalSection::criticalSection()
{
    if(pthread_mutex_init(&myMutex, NULL) != 0)
     printf("Mutex creating error!\n");
}
criticalSection::~criticalSection()
{
     pthread_mutex_destroy(&myMutex);
}
void criticalSection::enter()
{
    pthread_mutex_lock(&myMutex);
}
void criticalSection::leave()
{
    pthread_mutex_unlock(&myMutex);
}

Автор: xvr 26.8.2010, 12:34
Цитата(REZiaMIX @  26.8.2010,  09:43 Найти цитируемый пост)
Блокировать секцию, которая отвечает за синхронизацию доступа ко всему массиву - кажется очень накладно. 
Это зависит от частоты удаления и добавления новых клиентов. Если это происходит не очень часто, то можно блокировать весь массив.

Цитата(REZiaMIX @  26.8.2010,  09:43 Найти цитируемый пост)
Делать по мьютексу для каждого клиента?
Собственно сам мьютекс занимает места немного, но он создает объект в ядре - а там место может и закончится. Надо смотреть в ядро.



Автор: REZiaMIX 26.8.2010, 12:48
Цитата(xvr @ 26.8.2010,  12:34)
Собственно сам мьютекс занимает места немного, но он создает объект в ядре - а там место может и закончится. Надо смотреть в ядро.

Ну если памяти хватает на 2 миллиона, то думаю даже 100 тысяч незначительны. Тут вопрос - может можно сделать более красиво?

Автор: MAKCim 26.8.2010, 23:36
Цитата(xvr @  26.8.2010,  12:34 Найти цитируемый пост)
Собственно сам мьютекс занимает места немного, но он создает объект в ядре 

если речь идет про pthread_mutex_t, то объекта ядра нет

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)