Как человек, который разработал свой собственный планировщик кражи работы, я могу сказать следующее:
- Не пишите свой собственный планировщик (и здесь рассчитывается рабочая очередь).
- Вы либо сделаете это неэффективно, либо ошибетесь.
На самом деле, не так сложно написать правильный планировщик. К сожалению, сложно , если вы хотите сделать это эффективно. Эффективный планировщик эффективно исключает использование блокировок (за исключением, возможно, в очень специфических, четко определенных ситуациях), а межпотоковая связь без блокировок - это большая боль.
В качестве анекдота я фактически реализовал один планировщик, в котором мне, по сути, пришлось скопировать существующий алгоритм в код, и мне все же удалось ввести в код практически любое условие гонки. Отладка этого кода была смесью
- написание огромных , запутанных тестовых случаев (просто для выявления случайного сбоя, который произошел только в <1% прогонов), </li>
- тратя часы подряд просто глядя на код, пытаясь выяснить ошибку, применяя логику
- отслеживание каждой отдельной строки в отладчике (которая может произойти сбой без трассировки стека при возникновении ошибки), отслеживание состояния всех переменных в всех потоков вручную, чтобы быть убедитесь, что фактическое состояние программы соответствует ожидаемому состоянию
- сокращение кода в несколько раз, по существу, до нуля и перестройка, комментирование отдельных строк или пар строк, чтобы увидеть эффект ( огромное комбинаторное пространство), и
- бегом к стенам, головой вперед.