Что такое основной пример многопоточности “низкого уровня” в C++?

Вы можете использовать обратную косую черту, чтобы разбить команды на несколько строк.

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", чтобы имена файлов с пробелами и другими специальными символами обрабатывались правильно.

5
задан MrDatabase 13 October 2008 в 15:24
поделиться

8 ответов

Каноническая реализация "низкоуровневых потоков" является pthreads. Самыми основными примерами проблем многопоточности, которые обычно преподаются наряду с pthreads, является некоторая форма проблемы со средствами чтения и устройствами записи. Та страница также связывается с более классическими проблемами многопоточности как производители/потребители и обеденные философы.

12
ответ дан 18 December 2019 в 06:04
поделиться

Вот быстрый пример использования 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;
}
3
ответ дан 18 December 2019 в 06:04
поделиться

Он, вероятно, обращался к Вашему использованию C#, не Вашему опыту поточной обработки.

3
ответ дан 18 December 2019 в 06:04
поделиться

Если это - игровая компания, то они, вероятно, хотят ответ что-то вроде этого:

"Я реализовал многопоточную стандартную программу AI, которая выделила вычисления дерева решений для NPCs среди доступных ресурсов ЦП. Корректная блокировка, особенно при интеграции кода с остальной частью приложения, была трудной. Мы также провели некоторое время, отслеживая использование ресурсов на поток, таким образом, мы могли возвратить обработку AI к исходному состоянию, когда это угрожало вмешаться в основную скорость отклика UI".

(Я сделал все, что, я лично на самом деле не сделал ни одного из этого. усмешка)

3
ответ дан 18 December 2019 в 06:04
поделиться

Я смотрел бы на http://zthread.sourceforge.net/, который является превосходной оберткой вокруг библиотеки PThreads. Это - очень быстрое и стабильное и может быть библиотекой довольно низкого уровня. Очень хорошо записанный и зарегистрированный.

2
ответ дан 18 December 2019 в 06:04
поделиться

хорошо, если Вы действительно хотите взять эту идею "макс.", и Вы готовы пачкать руки с потоками. Я рекомендовал бы пытаться реализовать библиотеку потока пространства пользователя.

изучите uconext.h и его различные процедуры (setcontext, swapcontext и makecontext) и попытайтесь записать простую совместную библиотеку потока с ними. реализуйте блокировки, условные переменные распараллеливают создание/разрушение и совместное получение. Это не будет особенно необычно (т.е. существует не на самом деле параллелизм (для этого, Вы должны к эфиру вырыть в системный вызов клона или ядро), но если можно сделать это, никто не сможет сказать, что у Вас нет низкоуровневого опыта.

Только дать смысл масштаба проекта. Я записал просто такую простую библиотеку потока приблизительно в 500 строках C++, и полагая, что по крайней мере 20% из этого были комментариями, операторами контроля и регистрирующийся для отладки целей.

1
ответ дан 18 December 2019 в 06:04
поделиться

Также Потоки Повышения являются довольно портативной оберткой вокруг pthreads и потоков Windows... и от того, что я слышу многих, игра dev магазины использует C++ и как некоторые библиотеки Boost.

1
ответ дан 18 December 2019 в 06:04
поделиться

Я не думаю, что существует много различия между тем, что Вы делали и использовали pthreads, чтобы быть честными. При выполнении существенного объема работы с потоками, Вы будете иметь все проблемы с блокировкой, синхронизацией и т.д., и могли взять использование pthreads вызовы непосредственно достаточно легко. Одной вещью это немного хитро, от которого Вы были, вероятно, изолированы, является завершение, вытаскивая коды выхода из потоков и т.д.

(Конечно, pthreads не как низкий уровень, поскольку можно добраться; если Вы находитесь на Linux, смотрите на клон (), чтобы видеть, как он действительно работает на уровне системного вызова. Но никто на самом деле не использует это, если они не реализуют pthreads.)

2
ответ дан 18 December 2019 в 06:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: