Я не уверен, что смогу понять вашу логику, но это
awk '/\.design$/ {sub("/[^/]*$", "")} 1 ' file
build/create_changes.sh
build/create_changes.sh-meta.xml
src/aura/camping
src/aura/camping/camping.design-meta.xml
даст желаемый результат...
Я не уверен, что 1 :1 модель потоков гарантирована в java. Это означает, что поток Java может представлять или не представлять поток ОС. Вполне может быть, что несколько потоков Java управляются средой выполнения Java -и представляются ОС как меньшее количество потоков. Это действительно зависит от реализации. Я бы рекомендовал язык более низкого -уровня (C или ржавчину ), чтобы быть уверенным в соотношении 1 :1.
Поскольку для вас важно разделение времени, я также рекомендую выбрать приоритет реального времени с помощью setpriority()
, что дает вам доступ к некоторым интересным политикам планирования. Если вы хотите избежать разделения времени -, используйте политику SCHED_FIFO
. Это гарантирует, что поток не будет прерван до тех пор, пока он не будет завершен, если только поток с более высоким приоритетом не поставлен в очередь. Если все потоки 5k имеют одинаковый приоритет, это действительно будет первое -в -первое -решение с минимальным переключением контекста. Подробности см. в sched(7)
.
Ваши потоки не будут прерываться до тех пор, пока они не закончатся или не вызовутread()
для FD, представляющего мьютекс, или какого-либо другого файла, представляющего, когда взаимодействие между потоками -будет готово для чтения. Именно в этот момент ваш поток будет заблокирован, и у другого потока появится возможность запуститься.
Поэтому я думаю, что ваша идея использовать 5 000 потоков и просто ставить их в очередь — хорошая идея.
Одна ловушка идет с ядром -rt
.Это обеспечивает упреждающее -упреждающее планирование, которое повышает точность времени пробуждения потоков за счет производительности. (Очереди ЦП очищаются заранее ). С таким вопросом низкого уровня -я предполагаю, что вы пытаетесь максимизировать производительность, поэтому это не сработает для вас.