Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Синхронизация потоков.






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

Критические разделы. (critical section)

Для создания и использования критического раздела, нужно объявить переменную типа CRITICAL_SECTION, в примере в Unit1.h

...
public: // User declarations
CRITICAL_SECTION CS;
...

// Потом эту переменную CS нужно инициализировать (создать критический раздел)
__fastcall TForm1:: TForm1(TComponent* Owner)
: TForm(Owner)
{
InitializeCriticalSection(& CS);
}

// используем критический раздел в потоке, когда нужно блокировать доступ к данным
void __fastcall TMyThread:: Execute()
{
FreeOnTerminate = true; // освободить занятую потоком память по окончании его работы
for(int i=0; i< 10000; i++)
{
// -- какие-то сложные вычисления в цикле
if(Terminated) break; // прекратить извне поток
EnterCriticalSection(& Form1-> CS); // блокировать доступ к данным (войти в критический раздел)
... доступ к глобальным данным
LeaveCriticalSection(& Form1-> CS); // закрыть критический раздел (покинуть критический раздел)
}
}

Когда критический раздел становиться не нужен, удаляем его
void __fastcall TForm1:: FormClose(TObject *Sender, TCloseAction & Action)
{
DeleteCriticalSection(& CS); // удалить критический раздел

 

Мьютексы. (mutex)

Мьютексы выполняются медленнее критических разделов, однако они обладают большими возможностями, чем критические разделы. Так, например, они могут использоваться разными процессами. Создаются они с помощью API-функции CreateMutex(), работа с ними также осуществляется с помощью API-функций, таких как WaitForSingleObject(), ReleaseMutex(), и др.

 

Предупреждение: исключения, которые возбуждены, но не перехвачены в TThread потомке при выполнении в методе Execute могут стать причиной access violations, когда Вы выполняете приложение вне интегрированной среды разработки. Вы можете принять меры против этого access violation, обеспечив метод Execute блоком try.._finally, который включает тело этого метода.

Каждый поток представляет собой объект, созданный системным менеджером объектов.
Как и любой объект, поток содержит данные и методы.
Для работы с методами потока есть соответствующие функции Win32 API.
При создании объекта, Windows предоставляет ему дескриптор, идентифицирующий объект. Функция создающая поток, возвращает дескриптор нового объекта. Этот дескриптор передается в качестве аргумента API-функциям, с его помощью можно приостановить поток, возобновить выполнение, изменить приоритет потока, прекратить выполнение потока, определить код завершения потока.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.