Я бы ожидал, что они будут примерно одинаковой скорости, но вы всегда можете оценить ее самостоятельно, если вам действительно все равно.С учетом вышесказанного, семафоры 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;
Предполагая оптимальную реализацию, я предполагаю, что блокировка мьютекса может быть немного быстрее, носнова, сравните его.