-Не включается компьютер - зову админа. Админ приходит, воздевает руки к небу, бормочет про себя невнятные слова, поворачивает мой стул 10 раз вокруг своей оси, пинает компьютер - тот начинает работать. Вновь воздевает руки к небу, что-то бормочет, уходит.
Со слов сисадмина:
-Прихожу к юзеру - этот дурак так вертелся на стуле, что у него шнур питания на ножку намотался и выскочил из компа. Матерюсь про себя, распутываю,запихиваю комп ногой подальше под стол, включаю, ухожу
Мультипроцессные системы с разделением времени позволили одновременное (параллельное) выполнение нескольких программ.
Каждый процесс имеет собственное, защищенное от вмешательства других адресное пространство — собственные данные.
Нередко требуется параллельная работа нескольких участков кода с общими данными
Поток управления
Поток управления (нить, thread) — это элемент процесса, который может выполняться на центральном процессоре.
Процесс начинает свою работу с одного (главного) потока, но может создавать дополнительные.
Процесс завершает свое выполнение после завершения работы главного потока (независимо от работы дополнительных потоков)
Поток управления
Каждый из дополнительных потоков управления описывается функцией, которую называют потоковой функцией.
При создании потока эта функция начинает выполняться (псевдо)параллельно с основной функцией программы.
С завершением потоковой функции поток прекращает свою работу
Процесс и потоки
Все потоки процесса разделяют общие:
адресное пространство;
таблицу открытых файлов;
глобальные и статические переменные;
другие ресурсы процесса.
Каждый поток имеет отдельные:
стек;
точку выполнения;
значения локальных переменных.
Основные операции над потоками
Создание потока
запуск потоковой функции;
передача аргументов в потоковую функцию.
Завершение работы потока
при завершении потоковой функции;
по инициативе завершаемого потока;
по инициативе другого потока.
Получение возвращенного потоком значения
Способы реализации потоков
1. В ядре системы (ОС Windows)
– преимущества:
планировщик процессора знает о наличии потоков и может учитывать их при планировании процессорного времени;
блокировка отдельного потока не оказывает влияния на другие потоки процесса.
– недостатки:
на переход в режим ядра и обратно при выполнении операций над потоками требуется время;
введение потоков нередко значительно снижает стабильность ядра ОС.
2. На уровне пользовательских функций (большинство версий Unix)
– преимущества:
операции над потоками выполняются быстрее;
не требуют модификации ядра ОС, оно остается простым и, как следствие, стабильным.
– недостатки:
блокировка одного потока может заблокировать весь процесс, т.к. планировщик процессора не знает о наличии в нем других потоков;
время процессора делится поровну между процессами без учета количества потоков в них.
Работа с потоками управления ОС Windows
Основные операции над потоками:
создание — CreateThread
завершение работы — ExitThread, TerminateThread
получения кода завершения потока - GetExitCodeThread
Создание потока
– HANDLE — дескриптор созданного потока
● CreateThread( – LPSECURITY_ATTRIBUTES — атрибуты безопасности, обычно NULL, – SIZE_T - начальный размер стека, 0 — размер по умолчанию, – LPTHREAD_START_ROUTINE — потоковая функция, – LPVOID — параметр, передаваемый в потоковую функцию, – DWORD — флаги, CREATE_SUSPENDED чтобы поток не начинал выполнение сразу (впоследствии он запускается через ResumeThread), – LPDWORD — адрес для получения идентификатора потока, NULL если не нужно )
Завершение работы потока
– void - функция не возвращается
● ExitThread( – DWORD — код завершения потока )
– BOOL — 0 если неудачно, иначе не 0
● TerminateThread( – HANDLE — дескриптор завершаемого потока, – DWORD — код завершения потока )
Потоки в ОС Unix
Концепция потоков появилась позднее создания базового ядра Unix, поэтому реализация потоков в различных версиях ОС различалась.
При разработке стандарта POSIX были разработаны POSIX-потоки (pthread), поддерживаемые большинством современных unix-систем.
При компиляции программы с использованием POSIX-потоков необходимо указать ключ - lpthread
Потоковая безопасность
Функция называется потоково-безопасносной (thread safe), если (псевдо)параллельное выполнение этой функции в нескольких потоках не может нарушить работу программы.
Функция является потоково-безопасной, если
она использует только локальные переменные, и указатели только на выделенную ею память;
если работа с глобальнами и статическими переменными, а также получаемыми указателями, синхронизирована;
функция может не допускать одновременных запусков, блокируя свою работу с помощью критической секции или мьютекса.
Части CRT, не являющиеся потоково-безопасными
Библиотека CRT создавалась задолго до появления концепции потоков, поэтому не является потоково-безопасной.
Небезопасной при многопоточной работе является обработка ошибок, поскольку она использует глобальную переменную errno
Небезопасной при многопоточной работе является, например, функция strtok, т.к. для хранения состояния между запусками она использует статические переменные.