|
|
||
2. Контекст потока |
||
В общем случае содержимое памяти, к которой поток имеет доступ во время своего исполнения, называется контекстом потока. Определим, каким ограничениям на доступ к памяти должны удовлетворять функции, чтобы их можно было безопасно вызывать в параллельных потоках. Для этого рассмотрим следующую функцию: Сколько бы раз эта функция не вызывалась параллельно работающими потоками, она будет корректно изменять значение переменной n, т. к. эта переменная является локальной в функции f. То есть для каждого нового вызова функции f будет создан новый локальный экземпляр переменной n. Такая функция f называется безопасной для потоков. Теперь введем глобальную переменную n и изменим нашу функцию следующим образом: int n; В этом случае параллельный вызов функции g несколькими потоками может дать некорректное изменение значения переменной n, т. к. значение этой переменной будет изменяться одновременно несколькими функциями g. В этом случае функция g не является безопасной для потоков. int count(} В общем случае функция называется повторно входимой или реентерабельной (reentrant или reenterable), если она удовлетворяет следующим требованиям:
В системном программировании часто также рассматриваются программы в кодах микропроцессора, выполнение которых может прерываться и возобновляться в любой момент времени. Причем одна и та же программа может запускаться прежде, чем завершилось исполнение предыдущего экземпляра этой программы. В этом случае также необходимо, чтобы программный код допускал корректное параллельное выполнение нескольких экземпляров программы. Это условие обеспечивается в том случае, если программа не изменяет свой код во время исполнения. Здесь под кодом подразумеваются как команды, так и данные, принадлежащие программе. Программа в кодах микропроцессора, которая не изменяет свой код, также называется реентерабельной. |
||
|
||
2 |