Chuong 8 -_multi-thread
Transcript of Chuong 8 -_multi-thread
1
Lập trình trên Windows
Lập trình đa tiểu trìnhMulti-Threaded Programming
Nguyễn Tri TuấnKhoa CNTT – ĐH.KHTN.Tp.HCMEmail: nttuan@ fit.hcmuns.edu.vn
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 2
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
2
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 3
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)
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 4
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
� 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ụ
x1 = a*b
x2 = c*d
kq = x1 + x2
Xử lý tuần tự Xử lý đồng hành
x1 = a*b x2 = c*d
kq = x1 + x2
3
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 5
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� …
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 6
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)
4
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 7
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
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 8
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
5
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 9
Một số khái niệm cơ bản – Tiến trình…(tt)
Cấu tạo của 1 process
User StackKernel Stack
Ngữ cảnh
Thread 1
Ngữ cảnh/Độ ưu tiên
CodeHeap
PROCESS
Dữ liệu, handles
User StackKernel Stack
Ngữ cảnh
Thread 2
User StackKernel Stack
Ngữ cảnh
Thread n
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 10
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
6
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 11
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
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 12
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
7
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13
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();
}
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 14
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
8
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 15
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ìnhcó 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
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 16
Một số khái niệm cơ bản – Độ ưu tiên của tiểu trình…(tt)
Base Priority
Process Priority Class Thread Priority Level
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
9
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 17
Một số khái niệm cơ bản – Độ ưu tiên của tiểu trình…(tt)
Base Priority
Process Priority Class Thread Priority Level
5 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL
5 Background NORMAL_PRIORITY_CLASS
THREAD_PRIORITY_LOWEST
6 IDLE_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST
6 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL
6 Background NORMAL_PRIORITY_CLASS
THREAD_PRIORITY_BELOW_NORMAL
7 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL
7 Background NORMAL_PRIORITY_CLASS
THREAD_PRIORITY_NORMAL
7 Foreground NORMAL_PRIORITY_CLASS
THREAD_PRIORITY_LOWEST
8 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST
8 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 18
Một số khái niệm cơ bản – Độ ưu tiên của tiểu trình…(tt)
Base Priority
Process Priority Class Thread Priority Level
8 Foreground NORMAL_PRIORITY_CLASS
THREAD_PRIORITY_BELOW_NORMAL
8 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST
9 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST
9 Foreground NORMAL_PRIORITY_CLASS
THREAD_PRIORITY_NORMAL
9 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL
10 Foreground NORMAL_PRIORITY_CLASS
THREAD_PRIORITY_ABOVE_NORMAL
10 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL
11 Foreground NORMAL_PRIORITY_CLASS
THREAD_PRIORITY_HIGHEST
11 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL
11 HIGH_PRIORITY_CLASS THREAD_PRIORITY_LOWEST
10
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 19
Một số khái niệm cơ bản – Độ ưu tiên của tiểu trình…(tt)
Base Priority
Process Priority Class Thread Priority Level
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
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 20
Một số khái niệm cơ bản – Độ ưu tiên của tiểu trình…(tt)
Base Priority
Process Priority Class Thread Priority Level
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
11
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 21
Một số khái niệm cơ bản – Độ ưu tiên của tiểu trình…(tt)
Base Priority
Process Priority Class Thread Priority Level
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
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 22
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();
...
}
12
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 23
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 SetThreadPriorityVD. 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
...
}
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 24
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.
13
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 25
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.
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 26
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
14
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 27
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);
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 28
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ó
}
15
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 29
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
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 30
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ó
}
16
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 31
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ácHANDLE 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);
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 32
Xây dựng ứng dụng … - Thay đổi trạng thái của tiểu trình
Các trạng thái hoạt động của 1 tiểu trình
TerminatedWaitingTransition
Ready
Standby
Running
Unblock/ResumeResource Available
Unblock
Resourcenot Available
Context SwitchPick to run
Block/SuspendResourceAvailable
Terminate
Preempted
RUNNABLE
NOT RUNNABLE
17
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 33
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 ResumeThreadDWORD 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
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 34
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));
18
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 35
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
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 36
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 TerminateThreadBOOL 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
19
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 37
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 chaVOID ExitProcess(UINT uExitCode);
BOOL TerminateProcess(HANDLE hProcess,
UINT uExitCode);
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 38
Đồng bộ hóa (Synchronization)
� Tổng quan
� Các đối tượng đồng bộ (Synchronization Objects)
� Các hàm chờ (Wait Functions)
20
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 39
Đồ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 đủ
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 40
Đồ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ự
21
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 41
Đồ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)
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 42
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)
22
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 43
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
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 44
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
23
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 45
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
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 46
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
24
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 47
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
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 48
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
25
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 49
Nhóm Single-object Wait FunctionsVí d ụ.
// T ạo ñối t ượng ñồng b ộ
char szMutexName[] = “MyMutex";
HANDLE hMutex = CreateMutex(NULL, FALSE,
szMutexName);
if (hMutex == NULL) {
// X ử lý l ỗi
...
}
...
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 50
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
}
26
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 51
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
Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 52
Nhóm Multiple-object Wait FunctionsVí 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);