Одновременное выполнение двух потоков

Я хочу знать, может ли программа одновременно запускать два потока (что в основном используется для правильного?). Но если бы я должен был выполнить системный вызов в одной функции, где он выполнялся в потоке A, а некоторые другие задачи выполнялись в другой функции, где он выполнялся в потоке B, оба они могли бы работать одновременно или моя вторая функция будет ждать завершения системного вызова?

Дополнение к моему исходному вопросу: теперь будет ли этот процесс оставаться бесперебойным процессом во время системного вызова? Я говорю об использовании любого системного вызова в UNIX/LINUX.

Ответ 1

Многопоточная и параллельная обработка - это две совершенно разные темы, каждая из которых достойна собственного разговора, но ради введения...

Заправка:
Когда вы запускаете исполняемый файл, он запускается в потоке внутри процесса. Когда вы запускаете другой поток, называете его потоком 2, теперь у вас есть 2 отдельно выполняемых цепочки выполнения (потоков) в рамках одного процесса. На одноядерный микропроцессор (uP) можно запускать несколько потоков, но не параллельно. Хотя концептуально потоки часто говорят, что они запускаются в одно и то же время, они фактически выполняются последовательно в срезах времени, выделенных и управляемых операционной системой. Эти срезы чередуются друг с другом. Таким образом, шаги выполнения потока 1 на самом деле не происходят одновременно с шагами выполнения потока 2. Эти поведения обычно распространяются на столько потоков, которые вы создаете, то есть пакеты цепей выполнения, которые работают в одном и том же процессе и время совместного использования срезы, выгруженные операционной системой.

Таким образом, в примере вашего системного вызова это действительно зависит от того, какой системный вызов подходит к тому, закончится ли он, прежде чем разрешить выполнение шагов выполнения другого потока. Несколько факторов играют в том, что произойдет: это блокирующий вызов? У одного потока больше приоритета, чем у другого. Какова продолжительность временных фрагментов?

Ссылки, относящиеся к нарезке в C:
Пример SO

POSIX
ANSI C

Параллельная обработка:
Когда многопоточное выполнение программы происходит в многоядерной системе (несколько uP или несколько многоядерных uP) потоки могут выполняться одновременно или параллельно, поскольку различные потоки могут быть разделены на отдельные ядра для совместного использования рабочей нагрузки. Это один пример параллельной обработки.

Опять же, концептуально параллельная обработка и потоки считаются схожими, поскольку они позволяют делать вещи одновременно. Но это только концепция, они действительно очень разные, как в целевом приложении, так и в технике. Там, где потоки полезны как способ идентифицировать и разделить всю задачу в процессе (например, сервер TCP/IP может запускать рабочий поток при запросе нового соединения, затем соединяется и поддерживает это соединение, пока он остается), параллельная обработка обычно используется для отправки небольших компонентов одной и той же задачи (например, сложного набора вычислений, которые могут выполняться независимо в разных местах) для разделения ресурсов (ядер или uP), которые должны выполняться одновременно. Это - то, где многоядерные процессоры действительно имеют значение. Но параллельная обработка также использует преимущества нескольких систем, популярных в таких областях, как genetics и MMORPG.

Ссылки, относящиеся к параллельной обработке в C:
OpenMP
Больше OpenMP (примеры)
Лаборатории Gribble - Введение в OpenMP
CUDA Tookit от NVIDIA

Дополнительное чтение по общей теме потоковой обработки и архитектуры:

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

Ответ 2

Да, они, по крайней мере, потенциально могли бы запускать "в одно и то же время", это именно то, для чего нужны потоки; конечно, есть много деталей, например:

  • Если оба потока выполняют системные вызовы, например, пишите в тот же файловый дескриптор, что они могут временно блокировать друг друга.

  • Если используются примитивы синхронизации потоков, такие как мьютексы, то параллельное выполнение будет заблокировано.

  • Вам нужен процессор с не менее чем двумя ядрами, чтобы иметь два потока, действительно выполняемых одновременно.

Это очень большой и очень сложный предмет.

Ответ 3

Они будут запускаться одновременно, поскольку один поток независим от другого, даже если вы выполняете системный вызов.

Это довольно легко проверить, но вы можете создать один поток, который выводит что-то на вывод консоли и выполнять системный вызов в другом потоке, который, как вы знаете, займет некоторое разумное количество времени. Вы заметите, что сообщения будут продолжать печататься другим потоком.

Ответ 4

Да, программа может одновременно запускать две threads.

он называется Многопоточность.

оба они смогут работать одновременно или моя вторая функция будет ждать завершения системного вызова?

Оба они могут работать одновременно.


если вы хотите, вы можете сделать thread B до тех пор, пока Thread A не завершит или не вернет

Ответ 5

Основы просты, но детали быстро становятся сложными.

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

На одном процессоре несколько потоков распределяются путем "временного разбиения" процессора каким-то образом - либо на основе простых часов, либо путем пропускания одного потока, пока он не должен ждать (например, для ввода-вывода), а затем "переключение" к следующей теме. Для достижения максимальной эффективности существует целое искусство/наука.

На многопроцессорном компьютере (например, на большинстве современных ПК, имеющих от 2 до 8 "ядер) каждый поток назначается отдельному процессору, а если процессоров недостаточно, то они разделяются, как в случае с одним процессором.

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

Ответ 6

  • Если ваш компьютер имеет только один процессор, вы должны знать, как он может выполнять более одного потока одновременно.

  • В однопроцессорных системах в данный момент времени выполняется только один поток выполнения. потому что однопроцессорные системы поддерживают логический concurrency, а не физический concurrency.

  • В многопроцессорных системах одновременно выполняются несколько потоков, и физический concurrency достигается.

  • Важная особенность многопоточных программ заключается в том, что они поддерживают логический concurrency, а не физический concurrency.

Ответ 7

Два потока могут выполняться одновременно, только если он работает в многоядерной процессорной системе, но если он имеет только один основной процессор, то два потока не могут запускаться одновременно. Таким образом, только один поток запускается за раз, и если он заканчивает свое задание, то следующий поток, который находится в очереди, занимает время.