Я узнал, что у процесса есть состояния работает, готов, заблокирован и приостановлен. Потоки также имеют эти состояния, за исключением состояния приостановки, потому что они находятся в адресном пространстве процесса.
Процесс блокируется большую часть времени, когда он выполняет блокирующий ввод-вывод или ожидает события.
Я могу легко представить блокировку процесса, если он однопоточный или следует модели "один ко многим", но как это работает, если процесс многопоточный?
Например:
У меня есть процесс с двумя потоками в системе, которая следует модели один к одному. Один обрабатывает графический интерфейс, а другой - блокирующий ввод-вывод. Я знаю, что процесс остается отзывчивым, потому что другой поток обрабатывает ввод-вывод.
Так есть ли шанс, что процесс блокируется, или я должен просто исключить это в этом случае?
Я только начинаю вникать в эти вещи, так что простите меня, если я еще не понял некоторых важных деталей.
Ответ 1 · рейтинг 1 · i_am_jorf
Допустим, у вас есть рабочая очередь, в которой поток пользовательского интерфейса планирует выполнение работы, а поток ввода-вывода ищет там работу, которую нужно выполнить. Сама рабочая очередь - это данные, которые считываются и изменяются из обоих потоков, поэтому вы должны как-то синхронизировать доступ, иначе возникнут условия гонки.
Наивный подход - синхронизировать доступ к очереди с помощью блокировки (она же критическая секция). Если поток ввода-вывода получает блокировку, а затем блокируется, поток пользовательского интерфейса будет реагировать только до тех пор, пока не решит, что ему нужно запланировать работу, и не попытается получить блокировку. Лучшим подходом является использование очереди без блокировки, о которой много написано, и вы можете легко найти дополнительную информацию.
Но чтобы ответить на ваш вопрос, да, все же намного проще, чем вы думаете, заставить пользовательский интерфейс заикаться / зависать даже при использовании нескольких потоков. Существуют различные библиотеки, которые упрощают или усложняют решение этой проблемы, поэтому в зависимости от вашей ОС и выбранного языка может быть что-то лучше, чем просто примитивы ОС. Win32 (насколько я помню) не делает это очень простым, несмотря на наличие всевозможных примитивов синхронизации. Pthreads и Boost никогда не казались мне очень простыми. GCD от Apple значительно упрощает семантическое выражение того, что вы хотите (по моему мнению), хотя все еще есть подводные камни, о которых следует помнить (например, планирование слишком большого количества блокирующих операций в одной рабочей очереди, чтобы их можно было выполнить). выполняется параллельно и вызывает перегрузку процессора, когда все они просыпаются одновременно).
Мой совет - просто погрузиться и написать много многопоточного кода. Это может быть сложно отлаживать, но вы многому научитесь, и в конечном итоге это станет вашей второй натурой.