1. L p trình trên Windows
L p trình đa ti u trình
Multi-Threaded Programming
Nguy n Tri Tu n
Khoa CNTT – ĐH.KHTN.Tp.HCM
Email: nttuan@ fit.hcmuns.edu.vn
N i dung
M t s khái ni m cơ b n
Xây d ng m t ng d ng đa ti u trình
Đ ng b hóa
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 2
1
2. M t s khái ni m cơ b n
X lý đ ng hành (Concurrent Processing)
Đa nhi m (Multi-Tasking)
Ti n trình (Process)
Ti u trình (Thread)
Đ ưu tiên c a ti n trình (Process priority
class)
Đ ưu tiên c a ti u trình (Thread priority)
Chuy n đ i ng c nh (Context Switch)
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 3
M t s khái ni m cơ b n - X lý đ ng hành
X lý đ ng hành ?
Bài toán: kq = a*b + c*d
x1 = a*b
x2 = c*d x1 = a*b x2 = c*d
kq = x1 + x2 kq = x1 + x2
X lý tu n t X lý đ ng hành
M t h th ng x lý đ ng hành thư ng có nhi u
ti n trình th c thi cùng lúc
Các ti n trình có th ho t đ ng đ c l p hay k t
h p v i nhau đ th c hi n nhi u tác v
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 4
2
3. M t s khái ni m cơ b n - X lý đ ng hành…(tt)
L i ích c a x lý đ ng hành
Cho phép nhi u ng d ng ho t đ ng cùng lúc
Tăng t c đ x lý
Tăng hi u su t s d ng CPU
…
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 5
M t s khái ni m cơ b n – Đa nhi m
H đi u hành đa nhi m phân chia th i gian x lý c a
CPU thành nhi u “lát th i gian” (time slice) đ các ti n
trình/ti u trình th c hi n luân phiên
Ti n trình/ti u trình đang th c thi s t m d ng khi time
slice c a nó h t và ti n trình/ti u trình khác s ch y
Khi h th ng chuy n đ i t thread này sang thread
khác, nó s lưu l i ng c nh c a thread b m t quy n
và ph c h i ng c nh c a thread s p đư c ch y
Đ dài time slice ph thu c t ng h đi u hành và b vi
x lý. B i vì time slice khá nh (kho ng 20ms) nên ta
có c m giác th c hi n đ ng th i
H đi u hành Windows h tr pre-emptive Multi-
Tasking (đa nhi m có đ ưu tiên)
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 6
3
4. M t s khái ni m cơ b n – Đa nhi m…(tt)
Nh ng v n đ khó khăn khi x lý đa nhi m
Không gian b nh đ lưu tr thông tin
ng c nh c a ti n trình và ti u trình
Th i gian đ theo v t, qu n lý các ti u
trình
S tranh ch p tài nguyên dùng chung
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 7
M t s khái ni m cơ b n – Ti n trình
Là m t chương trình đang th c thi
Có m t con tr l nh, vùng không gian đ a ch
o riêng, mã l nh, d li u, object handles,
các bi n môi trư ng, đ ưu tiên…
Các thu c tính này tác đ ng lên m i ti u
trình tr c thu c ti n trình
M t ti n trình có th có nhi u ti u trình
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 8
4
5. M t s khái ni m cơ b n – Ti n trình…(tt)
PROCESS
Heap Code D li u, Ng
handles c nh/Đ
ưu tiên
User Stack User Stack User Stack
Kernel Stack Kernel Stack Kernel Stack
Ng c nh Ng c nh Ng c nh
Thread 1 Thread 2 Thread n
C u t o c a 1 process
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 9
M t s khái ni m cơ b n – Ti u trình
Là đơn v nh nh t th c thi đư c trên h
đi u hành Windows 32 bits
Là đơn v x lý mà h đi u hành Windows
phân chia time slice
M i ti u trình bao g m các stack, tr ng thái
các thanh ghi CPU,… và m t entry trên danh
sách các ti u trình c a h th ng đi u ph i
Các ti u trình chia s ngu n tài nguyên
chung c a toàn b ti n trình
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 10
5
6. M t s khái ni m cơ b n – Đ ưu tiên c a ti n trình
Đ ưu tiên là thu c tính giúp h đi u hành xác đ nh
ti u trình nào s đư c th c hi n ti p theo, đ ng
th i phân chia th i gian x lý c a CPU
Khi th i đi m context switch đ n, Windows
dispatcher kh o sát t p các ti u trình tr ng thái
s n sàng và ch n ti u trình đ u tiên có đ ưu tiên
cao nh t trên hàng đ i đ th c hi n
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 11
M t s khái ni m cơ b n – Đ ưu tiên c a ti n trình…(tt)
M i ti n trình có th có đ ưu tiên khác nhau
IDLE_PRIORITY_CLASS: ch đư c th c hi n khi không còn
ti n trình nào s d ng CPU
NORMAL_PRIORITY_CLASS: đư c quy n s d ng CPU theo
th i gian phân chia. Đây là đ ưu tiên m c đ nh cho ti n trình
khi m i t o l p
HIGH_PRIORITY_CLASS: Ti n trình đư c dành quy n s
d ng CPU t các ti n trình thu c l p Normal ngay khi c n
REALTIME_PRIORITY_CLASS: Có đ ưu tiên cao nh t,
đư c s d ng CPU b t kỳ lúc nào
ABOVE_NORMAL_PRIORITY_CLASS (ch có trong Windows
2000 tr lên): cao hơn NORMAL nhưng th p hơn HIGH
priority
BELOW_NORMAL_PRIORITY_CLASS (ch có trong Windows
2000 tr lên): cao hơn IDLE nhưng th p hơn NORMAL
priority
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 12
6
7. M t s khái ni m cơ b n – Đ ưu tiên c a ti n trình…(tt)
Dùng hàm SetPriorityClass đ thay đ i đ ưu
tiên cho ti n trình
VD. Thay ñ i ñ ưu tiên c a ti n trình
DWORD errorCode;
HANDLE hProcess;
BOOL nStatus;
hProcess = GetCurrentProcess();
nStatus = SetPriorityClass(hProcess,
HIGH_PRIORITY_CLASS);
if (nStatus == 0) {
errorCode = GetLastError();
}
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 13
M t s khái ni m cơ b n – Đ ưu tiên c a ti u trình
M i ti u trình có 1 đ ưu tiên đư c xác l p
t 0 (th p nh t) đ n 31 (cao nh t), giá tr này
g i là Base Priority
Base Priority là giá tr đ ưu tiên c a ti u
trình tính trên toàn h th ng
Base Priority đư c xác đ nh b i:
Đ ưu tiên c a ti n trình ch a nó
M c đ ưu tiên c a ti u trình bên trong ti n trình
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 14
7
8. M t s khái ni m cơ b n – Đ ưu tiên c a ti u trình…(tt)
M c đ ưu tiên c a ti u trình bên trong ti n trình
có th là 1 trong các giá tr sau:
THREAD_PRIORITY_IDLE (-4): th p hơn 4 đi m so v i
đ ưu tiên NORMAL
THREAD_PRIORITY_ABOVE_IDLE (-3): th p hơn 3 đi m
so v i đ ưu tiên NORMAL
THREAD_PRIORITY_LOWEST (-2): th p hơn 2 đi m so
v i đ ưu tiên NORMAL
THREAD_PRIORITY_BELOW_NORMAL (-1): th p hơn 1
đi m so v i đ ưu tiên NORMAL
THREAD_PRIORITY_NORMAL: đ ưu tiên ngang v i đ ưu
tiên c a ti n trình
THREAD_PRIORITY_ABOVE_NORMAL (+1): cao hơn 1
đi m so v i đ ưu tiên NORMAL
THREAD_PRIORITY_HIGHEST (+2): cao hơn 2 đi m so
v i đ ưu tiên NORMAL
THREAD_PRIORITY_TIME_CRITICAL (+3): cao hơn 3
đi m so v i đ ưu tiên NORMAL
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 15
M t s khái ni m cơ b n – Đ ưu tiên c a ti u trình…(tt)
Base Process Priority Class Thread Priority Level
Priority
1 IDLE_PRIORITY_CLASS THREAD_PRIORITY_IDLE
1 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE
1 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE
1 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE
1 HIGH_PRIORITY_CLASS THREAD_PRIORITY_IDLE
2 IDLE_PRIORITY_CLASS THREAD_PRIORITY_LOWEST
3 IDLE_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL
4 IDLE_PRIORITY_CLASS THREAD_PRIORITY_NORMAL
4 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST
5 IDLE_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 16
8
9. M t s khái ni m cơ b n – Đ ưu tiên c a ti u trình…(tt)
Base Process Priority Class Thread Priority Level
Priority
5 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL
5 Background THREAD_PRIORITY_LOWEST
NORMAL_PRIORITY_CLASS
6 IDLE_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST
6 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL
6 Background THREAD_PRIORITY_BELOW_NORMAL
NORMAL_PRIORITY_CLASS
7 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL
7 Background THREAD_PRIORITY_NORMAL
NORMAL_PRIORITY_CLASS
7 Foreground THREAD_PRIORITY_LOWEST
NORMAL_PRIORITY_CLASS
8 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST
8 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 17
M t s khái ni m cơ b n – Đ ưu tiên c a ti u trình…(tt)
Base Process Priority Class Thread Priority Level
Priority
8 Foreground THREAD_PRIORITY_BELOW_NORMAL
NORMAL_PRIORITY_CLASS
8 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST
9 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST
9 Foreground THREAD_PRIORITY_NORMAL
NORMAL_PRIORITY_CLASS
9 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL
10 Foreground THREAD_PRIORITY_ABOVE_NORMAL
NORMAL_PRIORITY_CLASS
10 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL
11 Foreground THREAD_PRIORITY_HIGHEST
NORMAL_PRIORITY_CLASS
11 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL
11 HIGH_PRIORITY_CLASS THREAD_PRIORITY_LOWEST
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 18
9
10. M t s khái ni m cơ b n – Đ ưu tiên c a ti u trình…(tt)
Base Process Priority Class Thread Priority Level
Priority
12 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST
12 HIGH_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL
12 HIGH_PRIORITY_CLASS THREAD_PRIORITY_NORMAL
14 HIGH_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL
15 HIGH_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST
15 HIGH_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL
15 IDLE_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL
15 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL
15 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL
15 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 19
M t s khái ni m cơ b n – Đ ưu tiên c a ti u trình…(tt)
Base Process Priority Class Thread Priority Level
Priority
16 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_IDLE
17 REALTIME_PRIORITY_CLASS -7
18 REALTIME_PRIORITY_CLASS -6
19 REALTIME_PRIORITY_CLASS -5
20 REALTIME_PRIORITY_CLASS -4
21 REALTIME_PRIORITY_CLASS -3
22 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_LOWEST
23 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL
24 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_NORMAL
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 20
10
11. M t s khái ni m cơ b n – Đ ưu tiên c a ti u trình…(tt)
Base Process Priority Class Thread Priority Level
Priority
25 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL
26 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST
27 REALTIME_PRIORITY_CLASS 3
28 REALTIME_PRIORITY_CLASS 4
29 REALTIME_PRIORITY_CLASS 5
30 REALTIME_PRIORITY_CLASS 6
31 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 21
M t s khái ni m cơ b n – Đ ưu tiên c a ti u trình…(tt)
Theo m c đ nh m t ti u trình v a m i đư c t o ra s có đ
ưu tiên THREAD_PRIORITY_NORMAL
Ta có th xác đ nh đ ưu tiên c a ti u trình b ng cách g i
hàm GetThreadPriority
VD. Ki m tra ñ ưu tiên c a ti u trình
int threadPriority;
DWORD errorCode;
HANDLE hThread;
hThread = GetCurrentThread();
threadPriority = GetThreadPriority(hThread);
if (threadPriority == THREAD_PRIORITY_ERROR_RETURN)
{
errorCode = GetLastError();
...
}
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 22
11
12. M t s khái ni m cơ b n – Đ ưu tiên c a ti u trình…(tt)
ng d ng có th tăng hay gi m ưu tiên c a ti u trình b ng
cách g i hàm SetThreadPriority
VD. Thay ñ i ñ ưu tiên c a 1 ti u trình
DWORD errorCode;
HANDLE hThread;
BOOL nStatus;
hThread = GetCurrentThread();
nStatus = SetThreadPriority(hThread,
THREAD_PRIORITY_HIGHEST);
if (nStatus == 0) {
errorCode = GetLastError();
...
}
else {
// Th c hi n vài vi c ưu tiên cao
...
}
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 23
M t s khái ni m cơ b n – Chuy n đ i ng c nh
Đ chuy n đ i x lý t ti u trình này sang ti u
trình khác trong hàng đ i, h th ng ph i th c
hi n vi c chuy n đ i ng c nh:
Sao lưu ng c nh c a ti u trình t m ngưng x lý.
Đưa ti u trình này vào hàng đ i h th ng có đ ưu
tiên tương ng v i đ ưu tiên x lý c a ti u trình.
Xác đ nh ti u trình s n sàng trong hàng đ i có đ
ưu tiên x lý cao nh t.
N p thông tin ng c nh c a ti u trình đư c ch n
vào h th ng, xoá b ti u trình này trong hàng đ i
h th ng và th c thi ti u trình này.
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 24
12
13. M t s khái ni m cơ b n – Chuy n đ i ng c nh…(tt)
Vi c chuy n đ i ng c nh ch đư c th c
hi n trong ba tình hu ng:
Khi th i gian x lý c a m t ti u trình đã h t.
Khi ti u trình đang x lý ph i chuy n sang tr ng
thái ch , nó ph i t b th i gian x lý còn l i.
M t ti u trình có đ ưu tiên x lý cao hơn v a t
tr ng thái ch (block, suspend) chuy n sang
tr ng thái s n sàng.
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 25
Xây d ng m t ng d ng đa ti u trình
T o l p ti u trình
Thay đ i tr ng thái c a ti u trình
K t thúc ti u trình
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 26
13
14. Xây d ng ng d ng đa ti u trình - T o l p ti u trình
Thông thư ng, ch có 1 ti u trình duy nh t trong
m t ti n trình lúc b t đ u
T ti u trình ban đ u này, ta có th t o ra các ti u
trình khác b ng cách g i hàm CreateThread.
Hàm này đư c đ nh nghĩa như sau:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter, DWORD dwCreationFlags,
LPDWORD lpThreadId);
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 27
Xây d ng ng d ng đa ti u trình - T o l p ti u trình…(tt)
VD. T o m i ti u trình: kích thư c stack m c ñ nh, hàm
ThreadFunc là hàm b t ñ u th c thi c a ti u trình,
myData là d li u riêng ñư c g i ñ n ti u trình, ti u
trình th c thi ngay sau khi t o
HANDLE hThread;
DWORD errorCode;
hThread = CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE) ThreadFunc,
(LPVOID) &myData, 0, 0);
if (hThread == 0)
{
errorCode = GetLastError();
// X lý l i, n u có
}
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 28
14
15. Xây d ng ng d ng đa ti u trình - T o l p ti u trình…(tt)
Hàm b t đ u th c thi c a ti u trình (ThreadProc)
có d ng chung như sau:
DWORD WINAPI ThreadProc(LPVOID lpParameter);
Thông thư ng, ti u trình đư c t o s có đ ưu tiên
m c đ nh là THREAD_PRIORITY_NORMAL
Ta có th dùng các hàm GetThreadPriority và
SetThreadPriority đ thay đ i đ ưu tiên c a
ti u trình
S lư ng ti u trình đư c t o ra tùy thu c vào kích
thư c stack.
N u m i ti u trình dùng 1MB stack, ta có th t o ta
max. 32 ti u trình
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 29
Xây d ng ng d ng đa ti u trình - T o l p ti u trình…(tt)
VD. T o 1 ti u trình, hi n th câu thông báo
DWORD WINAPI ThreadFunc(LPVOID lpParam)
{
MessageBox(NULL, (LPSTR) lpParam, "ThreadFunc", MB_OK);
return 0;
}
...
HANDLE hThread;
char szMsg[] = “This message is displayed in thread”;
DWORD errorCode;
hThread = CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE) ThreadFunc,
(LPVOID) szMsg, 0, 0);
if (hThread == 0)
{
errorCode = GetLastError();
// X lý l i, n u có
}
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 30
15
16. Xây d ng ng d ng đa ti u trình - T o l p ti u trình…(tt)
M t hàm khác đ t o ra ti u trình là
CreateRemoteThread
Hàm này t o ra m t ti u trình ch y không gian
đ a ch o c a m t ti n trình khác
HANDLE CreateRemoteThread(
HANDLE hProcess, // Ti n trình ch a ti u
// trình ñư c t o
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter, DWORD dwCreationFlags,
LPDWORD lpThreadId);
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 31
Xây d ng ng d ng … - Thay đ i tr ng thái c a ti u trình
RUNNABLE
Pick to run Standby Context Switch
Ready Running
Preempted
Resource Unblock/Resume Block/Suspend Terminate
Available Resource Available
Transition Waiting Terminated
Unblock
Resource
not Available
NOT RUNNABLE
Các tr ng thái ho t đ ng c a 1 ti u trình
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 32
16
17. Xây d ng ng d ng … - Thay đ i tr ng thái c a ti u trình…(tt)
Ta có th t m ngưng th c thi m t ti u trình b ng
cách g i hàm SuspendThread và khôi ph c l i
ho t đ ng b ng hàm ResumeThread
DWORD SuspendThread(HANDLE hThread);
DWORD ResumeThread(HANDLE hThread);
K t qu tr v là Suspend-Count, bi n đ m s l n
suspend trư c đó
M i l n g i SuspendThread s làm tăng giá tr c a
Suspend-Count lên 1; và ngư c l i v i hàm
ResumeThread
N u như Suspend-Count v n còn l n hơn 0 thì ti u trình
v n còn b t m d ng
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 33
Xây d ng ng d ng … - Thay đ i tr ng thái c a ti u trình…(tt)
N u ti u trình đang g i các hàm h th ng,
thao tác suspend s th t b i
ng d ng có th ph i g i SuspendThread
nhi u l n cho đ n khi suspend thành công
VD. G i hàm ResumeThread cho ñ n khi
ti u trình ñư c khôi ph c
while (ResumeThread(hThread));
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 34
17
18. Xây d ng ng d ng đa ti u trình - K t thúc ti u trình
M t ti u trình có th k t thúc vi c th c thi
c a chính nó b ng cách g i hàm
ExitThread
VOID ExitThread(DWORD dwExitCode);
Sau khi g i hàm này, ti u trình k t thúc và
quay tr v th t c kh i t o ti u trình
Windows khuy n cáo nên dùng hàm
ExitThread đ k t thúc m t ti u trình
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 35
Xây d ng ng d ng đa ti u trình - K t thúc ti u trình…(tt)
Ngoài ra, b t c ti u trình nào trong ti n trình đ u có
th k t thúc chính nó ho c ti u trình khác trong cùng
ti n trình b ng cách g i hàm TerminateThread
BOOL TerminateThread(
HANDLE hThread, // handle c a ti u
// trình c n k t thúc
DWORD dwExitCode // mã k t thúc
);
Khi s d ng hàm TerminateThread, ti u trình đích
s đư c k t thúc ngay l p t c và không c n đi u ki n,
và không có cơ h i đ gi i phóng tài nguyên
Hàm TerminateThread r t nguy hi m và ch nên s
d ng trong nh ng tình hu ng th t s kh n c p
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 36
18
19. Xây d ng ng d ng đa ti u trình - K t thúc ti u trình…(tt)
Vì ti u trình tr c thu c ti n trình, nên ta có
th k t thúc t t c các ti u trình b ng cách
k t thúc ti n trình cha
VOID ExitProcess(UINT uExitCode);
BOOL TerminateProcess(HANDLE hProcess,
UINT uExitCode);
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 37
Đ ng b hóa (Synchronization)
T ng quan
Các đ i tư ng đ ng b (Synchronization
Objects)
Các hàm ch (Wait Functions)
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 38
19
20. Đ ng b hóa – T ng quan
T i sao l i s d ng đ ng b hóa ?
Tranh ch p CPU và tài nguyên gi a các ti u
trình
T c đ x lý c a các ti u trình khác nhau (do đ
ph c t p c a thu t toán, t c đ truy xu t trên b
nh ph ,…) d n đ n k t qu c n thi t cho bư c
x lý ti p theo chưa đ y đ
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 39
Đ ng b hóa – T ng quan…(tt)
B n ch t c a vi c đ ng b hoá ?
Đ đ m b o không có s tranh ch p tài nguyên
gi a các ti u trình
Đ đ m b o các đo n code “ph thu c l n
nhau” đư c th c hi n đúng trình t
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 40
20
21. Đ ng b hóa – T ng quan…(tt)
Các thành ph n c n thi t cho vi c đ ng b
hoá:
Đ i tư ng đ ng b (Synchronization Object)
Hàm ch (Wait function)
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 41
Các đ i tư ng đ ng b (Synchronization Objects)
Đ nh nghĩa:
Là m t đ i tư ng mà handle (c a nó) đư c s
d ng như tham s truy n vào cho wait function
đ ph i h p ho t đ ng c a các ti u trình
Các đ i tư ng đ ng b có 2 tr ng thái: s n sàng
s d ng (signaled) và đang đư c s d ng (not
signaled)
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 42
21
22. Các đ i tư ng đ ng b hóa…(tt)
Các đ i tư ng đ ng b bao g m:
Event
Mutex
Semaphore
Waitable timer
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 43
Các đ i tư ng đ ng b hóa…(tt)
Mutex (“mutual exclusion”)
Không cho phép dùng chung
Tr ng thái:
signaled (owned)
not-signaled (not-owned)
Các hàm liên quan:
CreateMutex
ReleaseMutex
OpenMutex
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 44
22
23. Các đ i tư ng đ ng b hóa…(tt)
Semaphore
Cho phép m t s xác đ nh các thread đư c truy xu t
đ ng hành critical section
Bi n count: xác đ nh s lư ng t i đa các truy xu t
cho phép. Khi m t thread “wait” semaphore thành
công count s gi m đi 1. Khi count b ng 0, thread
s b block cho đ n khi có thread gi i phóng
semaphore (hàm ReleaseSemaphore)
Semaphore v i count t i đa b ng 1 đư c g i là
semaphore nh phân (binary semaphore) gi ng
như mutex
Các hàm liên quan:
CreateSemaphore
ReleaseSemaphore
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 45
Các hàm ch (Wait Functions)
Đ nh nghĩa:
Dùng đ “khoá” (block) ho t đ ng c a ti u trình
Hàm ch s không “tr v ” (return), cho đ n khi
nào đi u ki n đư c tho
Khi ti u trình g i hàm ch , có 2 kh năng có th
x y ra:
N u đi u ki n không tho , ti u trình rơi vào tr ng thái
“ch ”
Khi đi u ki n tho , ti u trình ti p t c th c hi n
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 46
23
24. Các hàm ch (Wait Functions) …(tt)
Các hàm ch bao g m:
Nhóm Single-Object
Nhóm Multi-Object
Nhóm Alertable
Nhóm Registered
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 47
Các hàm ch (Wait Functions) …(tt)
Nhóm Single-object Wait Functions:
SignalObjectAndWait
WaitForSingleObject
WaitForSingleObjectEx
Đ u yêu c u truy n vào handle c a m t đ i
tư ng đ ng b
K t thúc khi:
Đ i tư ng đ ng b có tr ng thái s n sàng s d ng
(signaled); hay
Đã đ i h t th i gian time-out
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 48
24
25. Nhóm Single-object Wait Functions
Ví d .
// T o ñ i tư ng ñ ng b
char szMutexName[] = “MyMutex";
HANDLE hMutex = CreateMutex(NULL, FALSE,
szMutexName);
if (hMutex == NULL) {
// X lý l i
...
}
...
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 49
Nhóm Single-object Wait Functions…(tt)
// Ch ñ i tư ng Mutex, timeout = 1000
if (WaitForSingleObject(hMutex, 1000)!=0) {
// X lý l i timeout
...
}
else {
// B t ñ u critical section
...
ReleaseMutex(hMutex); // gi i phóng mutex
// K t thúc critical section
}
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 50
25
26. Các hàm ch (Wait Functions) …(tt)
Nhóm Multiple-object Wait Functions:
WaitForMultipleObjects
WaitForMultipleObjectsEx
MsgWaitForMultipleObjects
MsgWaitForMultipleObjectsEx
Cho phép ch đ nh m t m ng ch a m t ho c
nhi u handle c a các đ i tư ng đ ng b
K t thúc khi:
M t (hay t t c ) đ i tư ng đ ng b có tr ng thái s n
sàng s d ng (signaled); hay
Đã đ i h t th i gian time-out
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 51
Nhóm Multiple-object Wait Functions
Ví d .
// t o các ti u trình
for (i=0; i<NUM_THREADS; i++)
{
ThreadHandle[i] = CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE)CountThread,
(LPVOID) n, 0, &ThreadID);
}
// ch t t c các ti u trình k t thúc x lý
Status = WaitForMultipleObjects(NUM_THREADS,
ThreadHandle, TRUE, INFINITE);
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 52
26
27. Cám ơn - H i & Đáp
C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM Winter 2007 53
27