Самый быстрый способ разбудить поток пула потоков - PullRequest
4 голосов
/ 23 сентября 2019

Я написал пул потоков с таким количеством потоков, сколько у меня есть (запасных ядер), чтобы избежать переключения контекста.Всякий раз, когда необходимо выполнить новую задачу, эта задача добавляется в кольцевой буфер без блокировки для использования потоками пула потоков.Каждый раз, когда добавляется новая задача, я в настоящее время вызываю sem_post .

Мои тесты показывают, что вызов sem_post занимает 10 микросекунд, когда есть потоки, ожидающие семафор.Некоторые вызовы занимают всего 50 нс (что, вероятно, означает, что полностью в пользовательском пространстве может быть установлено, что не было потоков, которые могли бы быть разбужены), но также часто встречается 350 +/- 30 наносекунд.

Этот вопрос касается случая, когда один или несколько потоков не имеют / не имеют ничего общего и ожидают на семафоре.

Я совсем не рад тому, что в этом случае вызывающий абонент (который пытается разбудитьновый поток) тратит 10 микросекунд за sem_post.

Нет ли более быстрого (с точки зрения вызывающего) способа разбудить спящий поток?Я могу жить с задержкой в ​​10 микросекунд, пока этот новый поток, наконец, не начнет работать, но поток, который выполняет пробуждение, не должен задерживаться так сильно.

Связанные вопросы, которые я мог бы найти (но не отвечаю на моивопрос) являются

Обратите внимание, что семафор, кажется, реализован поверх фьютекса.Я думаю, что futex - это самый быстрый способ для Linux?Возможно, быстрее использовать сигнал или прерывание?

...