Chuong 8 -_multi-thread

27
1 Lp trình trên Windows Lp trình đa tiu trình Multi-Threaded Programming Nguyn Tri Tun Khoa CNTT – ĐH.KHTN.Tp.HCM Email: nttuan@ fit.hcmuns.edu.vn Winter 2007 C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 2 Ni dung Mt skhái nim cơ bn Xây dng mt ng dng đa tiu trình Đồng bhóa

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);

27

Winter 2007C4W - MultiThread - Nguyen Tri Tuan - DH.KHTN Tp.HCM 53

Cám ơn - Hỏi & Đáp