Является ли sem_post / sem_wait значительно быстрее, чем pthread_mutex_lock / pthread_mutex_unlock? - PullRequest
4 голосов
/ 14 апреля 2011

У меня есть блок кода, который должен работать быстро, сейчас я использую pthread_mutex_lock/pthread_mutex_unlock для синхронизации потоков, но я видел, что это оказывает определенное влияние на производительность.Я бродил, если кто-нибудь когда-нибудь тестировал это, это sem_post/sem_wait значительно быстрее, чем pthread_mutex_lock/pthread_mutex_unlock?

Спасибо!

Ответы [ 4 ]

2 голосов
/ 14 апреля 2011

Я бы сказал, что семафор, вероятно, медленнее мьютекса, потому что у семафора есть надмножество поведения мьютекса.Вы можете попробовать что-то на уровне пользователя, например, спин-блокировку, которая работает без поддержки ядра, но все зависит от скорости блокировки / разблокировки и конкуренции.

2 голосов
/ 14 апреля 2011

Я бы ожидал, что они будут примерно одинаковой скорости, но вы всегда можете оценить ее самостоятельно, если вам действительно все равно.С учетом вышесказанного, семафоры POSIX имеют один , и, на мой взгляд, только один , преимущество перед более сложными примитивами, такими как мьютексы и условные переменные: sem_post требуетсябыть асинхронно безопасным по сигналу.Эта функция, связанная только с синхронизацией only , безопасна для асинхронного сигнала и позволяет выполнять минимальное взаимодействие между потоками из обработчика сигнала!- то, что в противном случае было бы невозможно без гораздо более тяжелых инструментов, таких как конвейеры или SysV IPC, которые плохо взаимодействуют с ориентированными на производительность идиомами pthread.

Редактировать: Для справки, самая простая реализацияpthread_mutex_trylock:

if (mutex->type==PTHREAD_MUTEX_DEFAULT) return atomic_swap(mutex->lock, EBUSY);
else /* lots of stuff to do */

и простейшая реализация sem_trywait:

int val = sem->val;
return (val>0 && atomic_compare_and_swap(sem->val, val, val-1)==val) ? 0 : EAGAIN;

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

2 голосов
/ 14 апреля 2011

Нет, это не значительно быстрее.Они реализованы с использованием тех же примитивов нижнего уровня (чтение спин-блокировок и системных вызовов).Реальный ответ, однако, будет сравнивать оба в вашей конкретной ситуации.

1 голос
/ 14 апреля 2011

Если вы используете Objective C, ваша среда может быть достаточно близка к Какао, чтобы можно было использовать Grand Central Dispatch, что, вероятно, будет еще быстрее и определенно будет еще проще

...