Вы можете использовать обратную косую черту, чтобы разбить команды на несколько строк.
for f in dev/scss/*.scss; do cat "$f"; echo; echo; done \
| additional-processing
После некоторых операторов, таких как &&
, ||
и |
, обратная косая черта не требуется. Баш знает, что команда не закончена. Если вы поместите |
в предыдущую строку, вам не понадобится обратный слеш.
for f in dev/scss/*.scss; do cat "$f"; echo; echo; done |
additional-processing
Таким образом, вы можете объединить большое количество команд.
for f in dev/scss/*.scss; do cat "$f"; echo; echo; done |
foo |
bar |
baz
Если цикл становится громоздким, вам также следует рассмотреть его оборачивание в вызов функции. Мне нравится такой подход, потому что это означает, что вам не нужно втискивать все в небольшое количество строк. Вы можете дать петле больше передышки с каждой командой на отдельной строке.
loop() {
for f in dev/scss/*.scss; do
cat "$f"
echo
echo
done
}
Это позволяет сократить ваш конвейер до чего-то более читабельного, например:
loop | foo | bar | baz
P.S. Всегда заключайте в кавычки расширения переменных. Напишите cat "$f"
, чтобы имена файлов с пробелами и другими специальными символами обрабатывались правильно. Sup>
Каноническая реализация "низкоуровневых потоков" является pthreads. Самыми основными примерами проблем многопоточности, которые обычно преподаются наряду с pthreads, является некоторая форма проблемы со средствами чтения и устройствами записи. Та страница также связывается с более классическими проблемами многопоточности как производители/потребители и обеденные философы.
Вот быстрый пример использования pthreads, на основе некоторого нашего тестового кода. Это порождает два потока и ожидает их для завершения.
int main( void )
{
pthread_t reader, writer;
void *arg;
// [... initialisation ...]
// Spawn threads
if( pthread_create( &reader, NULL, reader_func, arg ) ||
pthread_create( &writer, NULL, writer_func, arg ) )
{
perror( "pthread_create" );
return EX_OSERR;
}
// Wait while threads run
pthread_join( reader, &arg );
pthread_join( reader, &arg );
return EX_OK;
}
void *reader_func( void *arg )
{
// [... do some stuff ...]
return NULL;
}
void *writer_func( void *arg )
{
// [... do some different stuff ...]
return NULL;
}
Он, вероятно, обращался к Вашему использованию C#, не Вашему опыту поточной обработки.
Если это - игровая компания, то они, вероятно, хотят ответ что-то вроде этого:
"Я реализовал многопоточную стандартную программу AI, которая выделила вычисления дерева решений для NPCs среди доступных ресурсов ЦП. Корректная блокировка, особенно при интеграции кода с остальной частью приложения, была трудной. Мы также провели некоторое время, отслеживая использование ресурсов на поток, таким образом, мы могли возвратить обработку AI к исходному состоянию, когда это угрожало вмешаться в основную скорость отклика UI".
(Я сделал все, что, я лично на самом деле не сделал ни одного из этого. усмешка)
Я смотрел бы на http://zthread.sourceforge.net/, который является превосходной оберткой вокруг библиотеки PThreads. Это - очень быстрое и стабильное и может быть библиотекой довольно низкого уровня. Очень хорошо записанный и зарегистрированный.
хорошо, если Вы действительно хотите взять эту идею "макс.", и Вы готовы пачкать руки с потоками. Я рекомендовал бы пытаться реализовать библиотеку потока пространства пользователя.
изучите uconext.h и его различные процедуры (setcontext, swapcontext и makecontext) и попытайтесь записать простую совместную библиотеку потока с ними. реализуйте блокировки, условные переменные распараллеливают создание/разрушение и совместное получение. Это не будет особенно необычно (т.е. существует не на самом деле параллелизм (для этого, Вы должны к эфиру вырыть в системный вызов клона или ядро), но если можно сделать это, никто не сможет сказать, что у Вас нет низкоуровневого опыта.
Только дать смысл масштаба проекта. Я записал просто такую простую библиотеку потока приблизительно в 500 строках C++, и полагая, что по крайней мере 20% из этого были комментариями, операторами контроля и регистрирующийся для отладки целей.
Также Потоки Повышения являются довольно портативной оберткой вокруг pthreads и потоков Windows... и от того, что я слышу многих, игра dev магазины использует C++ и как некоторые библиотеки Boost.
Я не думаю, что существует много различия между тем, что Вы делали и использовали pthreads, чтобы быть честными. При выполнении существенного объема работы с потоками, Вы будете иметь все проблемы с блокировкой, синхронизацией и т.д., и могли взять использование pthreads вызовы непосредственно достаточно легко. Одной вещью это немного хитро, от которого Вы были, вероятно, изолированы, является завершение, вытаскивая коды выхода из потоков и т.д.
(Конечно, pthreads не как низкий уровень, поскольку можно добраться; если Вы находитесь на Linux, смотрите на клон (), чтобы видеть, как он действительно работает на уровне системного вызова. Но никто на самом деле не использует это, если они не реализуют pthreads.)