Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по технологиям программирования.pdf
Скачиваний:
53
Добавлен:
02.06.2015
Размер:
4.73 Mб
Скачать

Создание потока

HANDLE CreateThread(

psa, //указатель наструктуру атрбутовбезопастности cbStack, //размер стека потока pfnStartAddr,//указательна потоковуюфункцию

pvParam, //параметр потоковойфункции tdwCreate, //CREATE_SlJSPENDED или 0 pdwThreadID//идентификаторпотока

);

Завершение потока

Поток можетзавершиться в следующихслучаях:

Самоуничтожаетсяс помощьювызова ExitThread (не рекомендуется)

Функция потока возвращаетуправление (рекомендуемыйспособ)

Один из потоковданногоилистороннегопроцесса вызывает функциюTerminateThread(нежелательныйспособ)

Завершается процесс, содержащийданныйпоток (тоже нежелательно).

Функциюпотокаследуетпроектироватьтак,чтобы поток завершался толькопослетого, каконавозвращаетуправление. Приэтом:

любые С++-объекты, созданныеданнымпотоком,уничтожаются соответствующимидеструкторами;

система корректноосвобождаетпамять, которуюзанималстек потока;

системаустанавливаеткод завершенияданногопотока (поддерживаемыйобъектомядра "поток»);

счетчик пользователейданногообъектаядра "поток" уменьшаетсяна 1.

Совместимость потоков и стандартной библиотеки

В библиотеках времени выполнения MSVCRT C предоставляются следующие функции создания

_ beginthread(start_address , stack_size, *arglist);

и завершения потоков: _endtread ();

Синхронизация потоков ПРИМЕР1

volatilebool bReadyForProcessing= false; volatilebool bTerminate = false;

int iResult= 0;

DWORD WINAPI ThreadProc(PVOID pPararn)

{while(!bTerminate)

{if (bReadyForProcessing) {iResult= iResult* 100;

bReadyForProcessing= false

else

{Sleep(1); }

}

 

return 0;

 

}

int _main( )

{ DWORD dwID;

HANDLE hThread = CreateThread(NULL, 0, for(int i = 0; i < 1000; i++)

{iResult= 100; bReadyForProcessing= true; while(bReadyForProcessing)

Sleep(1); if(10000 != iResult)

{std::cout << "error" << std::endl;}

std::cout << i<<iResult<< std::endl;

}

bTerminate = true; return 0;

}