Читайте также:
|
|
Теперь вернемся к словам "попытка" и "блокировка в памяти". Чтобы понять, как можно управлять временем жизни объекта потока, вспомним еще одну важную технику - подсчет ссылок. Когда объект с управляемым временем жизни создается, его счетчик ссылок устанавливается равным 1 - это означает, что у объекта один "пользователь". Когда объект передается другому объекту, например, помещается в очередь, то его счетчик ссылок увеличивается на 1. Если же "пользователь" больше не нуждается в объекте, то счетчик ссылок объекта уменьшается на 1. Когда счетчик ссылок становится равным 0, то это означает, что объект больше никому не нужен и его можно безопасно уничтожить. Вместе с уничтожением объекта становится недействительным его дескриптор. Таким образом, при создании объекта и его передаче арбитру, метод Add создает новый дескриптор, связывает его с потоком и устанавливает для потока счетчик ссылок, равный единице. Метод Lock увеличивает счетчик ссылок на 1, а метод Release уменьшает счетчик ссылок на 1. То есть, объект потока не будет уничтожен до тех пор, пока у него хотя бы один "пользователь". Сюда включается очень важный момент - даже если поток завершился самостоятельно и вызывал для самого себя метод Release, то объект потока не будет уничтожен до тех пор, пока все пользователи потока явно от него не откажутся с помощью метода Release. Приведем пример кода, предполагая, что ThreadManager - это объект класса TMyThreadManager, Handle - это дескриптор потока, а Thread - это объект потока:
// создание потокаHandle:= ThreadManager.Add(TSomeThread.Create);....// работа с потокомThread:= ThreadManager.Lock(Handle);if Assigned(Thread) thenbegin....end;....// уничтожение потокаThreadManager.Release(Handle);Дата добавления: 2015-07-20; просмотров: 44 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Потоки и дескрипторы | | | Реализация параллельного потока |