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

Wait функции

Читайте также:
  1. III. ФУНКЦИИ ДЕЙСТВУЮЩИХ ЛИЦ
  2. III. Функции семьи
  3. Абсолютные и относительные ссылки. Стандартные формулы и функции. Логические функции
  4. Акцентная структура слова в русском языке. Система акцентных противопоставлений. Функции словесного ударения.
  5. Акцентная структура слова в русском языке. Функции словесного ударения.
  6. Алгоритм нахождения глобального экстремума функции
  7. Аппарат государства – это система государственных органов, обладающих государственной властью и осуществляющих функции государства.
  8. Аргументы функции main(): argv и argc
  9. Бактерицидные функции
  10. Бесконечно малые функции.
  11. Билет 6(функции соц-ии)

Как можно приостановить работу потока? Существует много способов. Вот некоторые из них.

Функция Sleep() приостанавливает работу потока на заданное число миллисекунд. Если в качестве аргумента вы укажите 0 ms, то произойдет следующее. Поток откажется от своего кванта процессорного времени, однако тут же появится в списке потоков готовых к выполнению. Иными словами произойдет намеренное переключение потоков. (Вернее сказать, попытка переключения. Ведь следующим для выполнения потоком вполне может стать тот же самый.)

Функция WaitForSingleObject() приостанавливает выполнение потока до тех пор, пока не произойдет одно из двух событий:

- истечет таймаут ожидания;

- ожидаемый объект перейдет в сигнальное (signaled) состояние.

По возвращаемому значению можно понять, какое из двух событий произошло. Ожидать с помощью wait-функций можно большинство объектов ядра, например, объект "процесс" или "поток", чтобы определить, когда они завершат свою работу.

Функции WaitForMultipleObjects передается сразу массив объектов. Можно ожидать срабатывания сразу всех объектов или какого-то одного из них.

Пример 2. Программа создает два одинаковых потока и ожидает их завершения. Потоки просто выводят текстовое сообщение, которое передано им при инициализации.

 

#include <windows.h> #include <process.h> unsigned __stdcall ThreadFunc(void * arg) // Функция потока { char ** str = (char**)arg; MessageBox(0,str[0],str[1],0); _endthreadex(0); return 0; }; int main(int argc, char* argv[]) { char * InitStr1[2] = {"First thread running!","11111"};// строка для первого потока char * InitStr2[2] = {"Second thread running!","22222"};// строка для второго потока unsigned uThreadIDs[2]; HANDLE hThreads[2]; hThreads[0] = (HANDLE)_beginthreadex(NULL, 0, &ThreadFunc, InitStr1, 0,&uThreadIDs[0]); hThreads[1] = (HANDLE)_beginthreadex(NULL, 0, &ThreadFunc, InitStr2, 0,&uThreadIDs[1]); // Ждем, пока потоки не завершат свою работу WaitForMultipleObjects(2, hThreads, TRUE, INFINITE); // Set no time-out // Закрываем дескрипторы CloseHandle(hThreads[0]); CloseHandle(hThreads[1]); return 0; }

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

Работая параллельно, потоки совместно используют адресное пространство процесса. Также все они имеют доступ к описателям (handles) открытых в процессе объектов. А что делать, если несколько потоков одновременно обращаются к одному ресурсу или необходимо как-то упорядочить работу потоков? Для этого используют объекты синхронизации и соответствующие механизмы.


1 | 2 | 3 | 4 | 5 | 6 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.)