V procesu může běžet jedno nebo více vláken. Vlákno je
základní jednotka vykonávání instrukcí programu,
které systém přiděluje procesor. Každý proces startuje v primárním vláknu.
Všechna vlákna sdílejí stejný adresový prostor a systémové zdroje. Každé
vlákno má vlastní handlery výjimek, prioritu a kontext. Kontext vlákna
obsahuje registry, zásobník jádra a vlákna a prostředí vlákna v adresovém
prostoru procesu. Vlákno může vykonávat libovolnou část kódu programu,
včetně částí vykonávaných jiným vláknem.
CreateThread |
|
Je riskantní v parametru funkce vlákna předávat adresu lokální proměnné z vlákna, ze kterého vytváříme nové vlákno, protože původní vlákno může skončit dřív než nové a adresa by byla neplatná. Předávají se adresy na dynamicky alokovanou paměť nebo vlákno počká, až se ukončí nové vlákno.
Př. Napište program a vytvořte v něm nové vlákno.
CreateRemoteThread |
|
OTÁZKA: Zjistěte podrobnější informace o vytvoření vlákna v jiném procesu. Např. musí funkce vlákna existovat v tomto nebo v cílovém procesu?
GetCurrentThreadId |
|
Př. Vypište id vlákna.
GetCurrentThread |
|
Př.
Zjistěte pseudo handle a "zveřejněný" pseudo handle vlákna a porovnejte ho s handlem z CreateThread
.
SuspendThread |
|
Př. Pozastavte vlákno (z něj).
ResumeThread |
|
Př. Pusťte vlákno.
Sleep |
|
GDI objekty (palety, kontexty zařízení, regiony, atd.) nejsou serializované, proto by se neměly sdílet.
Pro zamezení chybám souběhu (race conditions) a zablokování (deadlock) je potřeba synchronizovat přístup více vláken ke sdíleným prostředkům.
Ve vláknu je možné vytvořit okno, pak ale musí poskytovat smyčku zpráv, která bude vybírat zprávy z fronty zpráv.
ExitThread |
|
TerminateThread |
|
Vlákno se ukončí i když libovolné vlákno v procesu zavolá
ExitProcess
nebo
TerminateProcess
nebo když se ukončí funkce vlákna.
GetExitCodeThread |
|
Př. Vypište návratový kód vlákna.
TerminateThread
neukončuje korektně vlákna, pro ukončení
vlákna jiným by se
mělo postupovat takto:
CreateEvent
WaitForSingleObject
,
interval je 0
WaitForSingleObject
vrátí WAIT_OBJECT_0)
Pomocí lokálního uložení vlákna (TLS) lze vytvořit lokální kopii statických a globálních proměnných vláken.
TlsAlloc |
|
TlsSetValue |
|
TlsGetValue |
|
TlsFree |
|
Lokální uložení vlákna se používá takto:
TlsAlloc
se alokuje TLS index proměnnéTlsSetValue
se asociuje index s alokovanou pamětíTlsGetValue
vrací ukazatel do alokované paměti na základě indexu
TlsFree
Další funkce týkající se vláken jsou: