Мьютекс определенно то, что вы ищете.Если бы у каждого события был свой мьютекс, я бы не сильно беспокоился о производительности;причина в том, что, если вы не добавляете много обработчиков во время обработки событий, маловероятно, что мьютекс будет конфликтовать и замедлит вас.
Однако, если у вас более одного потокавызов метода operator () для того же объекта, этот мьютекс может стать проблемой.Но без этого, как вы будете гарантировать, что ваши обратные вызовы будут вызываться потокобезопасным способом?(Я заметил, что вы передаете целочисленную ссылку и возвращаете void, поэтому я предполагаю, что это не повторяющиеся обработчики.)
РЕДАКТИРОВАТЬ: очень хороший вопрос в вашем комментарии.Честно говоря, я никогда не задумывался о том, много ли у мьютексов накладных расходов при синхронном использовании.Поэтому я собрал этот небольшой тест.
#include <stdio.h>
#include <pthread.h>
#define USE_PTHREAD_MUTEX 1
int main(int argc, char * argv[]) {
pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL);
long useless_number = 0;
long counter;
for(counter = 0; counter < 100000000; counter++) {
#if USE_PTHREAD_MUTEX
pthread_mutex_lock(&mutex);
#endif
useless_number += rand();
#if USE_PTHREAD_MUTEX
pthread_mutex_unlock(&mutex);
#endif
}
printf("%ld\n", useless_number);
}
Я запустил его в своей системе и получил следующие среды выполнения.
При использовании USE_PTHREAD_MUTEX 0 среднее время выполнения составляет 1,2 секунды.
При использовании USE_PTHREAD_MUTEX 1 среднее время выполнения составляет 2,8 секунды.
Таким образом, для ответа на ваш вопрос определенно накладные расходы.Ваш пробег может варьироваться.Кроме того, если несколько потоков конкурируют за доступ к ресурсу, больше времени будет потрачено на блокировку, обязательноКроме того, в чисто синхронном контексте, скорее всего, будет потрачено больше времени на доступ к общему ресурсу, чем на ожидание блокировки / разблокировки мьютекса.То есть издержки самой логики мьютекса, вероятно, будут незначительными по сравнению с этими вещами.