Я написал пул потоков с таким количеством потоков, сколько у меня есть (запасных ядер), чтобы избежать переключения контекста.Всякий раз, когда необходимо выполнить новую задачу, эта задача добавляется в кольцевой буфер без блокировки для использования потоками пула потоков.Каждый раз, когда добавляется новая задача, я в настоящее время вызываю sem_post .
Мои тесты показывают, что вызов sem_post
занимает 10 микросекунд, когда есть потоки, ожидающие семафор.Некоторые вызовы занимают всего 50 нс (что, вероятно, означает, что полностью в пользовательском пространстве может быть установлено, что не было потоков, которые могли бы быть разбужены), но также часто встречается 350 +/- 30 наносекунд.
Этот вопрос касается случая, когда один или несколько потоков не имеют / не имеют ничего общего и ожидают на семафоре.
Я совсем не рад тому, что в этом случае вызывающий абонент (который пытается разбудитьновый поток) тратит 10 микросекунд за sem_post
.
Нет ли более быстрого (с точки зрения вызывающего) способа разбудить спящий поток?Я могу жить с задержкой в 10 микросекунд, пока этот новый поток, наконец, не начнет работать, но поток, который выполняет пробуждение, не должен задерживаться так сильно.
Связанные вопросы, которые я мог бы найти (но не отвечаю на моивопрос) являются
Обратите внимание, что семафор, кажется, реализован поверх фьютекса.Я думаю, что futex - это самый быстрый способ для Linux?Возможно, быстрее использовать сигнал или прерывание?