Атомарные операции Vs Mutex
- 19.08.12, 17:51
Сейчас наступило время многоядерных и многопроцессорных систем (даже в последних смартфонах уже 2+ ядер)
Основная проблема многопроцессорного программирование это проблемы одновременного доступа к данным...
Доступ к данным можно блокировать методом mutex-a (spin lock)
pthread_mutex_lock(&mutex);
// некая работа над глобальными данными
pthread_mutex_unlock(&mutex);
А можно при помощи атомарных операций
__sync_add_and_fetch( &global_int, 1 );
Сегодня пришло в голову проверить при каком количестве операций внутри блокируемого блока выгоднее использовать Mutex - а при каком такой-же набор __sync_ операций (т.е. косвенно протестировать сколько стоит pthread_mutex_lock VS __sync)
Фактически тест код mutex
for (i = 0; i < INC_TO; i++)
{
pthread_mutex_lock(&mutex);
for (int j = 0; j < MAX_OPS; j++)
global_int++;
pthread_mutex_unlock(&mutex);
}
И для атомик:
for (i = 0; i < INC_TO; i++)
{
for (int j = 0; j < MAX_OPS; j++)
__sync_add_and_fetch( &global_int, 1 );
}
Результаты тестов:
при MAX_OPS < 10 - лучше __sync_add_and_fetch,
при MAX_OPS >= 10 - лучше
pthread_mutex_lock && pthread_mutex_unlock,
Вывод: если вам нужно обновить одновременно меньше 10-ти переменных - при возможности лучше использовать атомарные операции, иначе - блок pthread_mutex_lock && pthread_mutex_unlock