[r]
(1)Lương Ánh Hoàng
hoangla@soict.hut.edu.vn Chương 3 Kiểm soát xung đột
(2)3.1 Khái niệm
3.2 Đoạn găng (Critical Section) 3.3 Đèn hiệu (Semaphore)
3.4 Mutex 3.5 Event
3.6 SRW Lock
(3)§ Xung đột là vấn đề phát sinh khi nhiều luồng của chương trình chạy
trên bộ vi xử lý đa nhân cùng truy nhập một tài ngun hệ thống
§ Ví dụ
3.1 Khái niệm
int x = 0;
DWORD WINAPI Thread(LPVOID lpParam) {
for (int i=0;i<2000000;i++) x++; return 0;
}
int _tmain(int argc, _TCHAR* argv[]) {
HANDLE hThread1 = CreateThread(NULL,NULL,Thread,NULL,NULL,NULL); HANDLE hThread2 = CreateThread(NULL,NULL,Thread,NULL,NULL,NULL); WaitForSingleObject(hThread1,INFINITE);
WaitForSingleObject(hThread2,INFINITE); printf("X=%d",x);
(4)§ Đoạn găng (Critical Section) là đoạn chương trình được bảo vệ bởi hệ
điều hành sao cho tại mọi thời điểm chỉ có một luồng được phép thực thi
§ Sử dụng
§ Khai báo: CRITICAL_SECTION cs
§ Khởi tạo: InitializeCriticalSection(&cs)
§ Sử dụng
EnterCriticalSection(&cs)
// Bắt đầu đoạn găng
…
// Kết thúc đoạn găng
LeaveCriticalSection(&cs)
//
DeleteCriticalSection(&cs) § Ví dụ
§ Đặc điểm: chỉ có tác dụng trong cùng một tiến trình
(5)§ Đèn hiệu (Semaphore) dùng để giới hạn số lượng luồng tối đa được
phép thực thi cùng một đoạn chương trình
§ Sử dụng
§ Khai báo: HANDLE hSemaphore
§ Khởi tạo: hSemaphore = CreateSemaphore(NULL,5,5,NULL)
§ Sử dụng
WaitForSingleObject(hSemaphore, 0L)
// … //
ReleaseSemaphore(hSemaphore,1,NULL)
//
CloseHandle(hSemaphore)
§ Ví dụ
§ Đặc điểm
§ Dùng chung được giữa các tiến trình
§ Tốc độ chậm hơn CRITICAL_SECTION
(6)§ Mutex dùng để bảo vệ tài nguyên của chương trình, tại một thời điểm
chỉ cho phép một luồng của một tiến trình truy nhập
§ Sử dụng
§ Khai báo: HANDLE hMutex;
§ Khởi tạo: hMutex = CreateMutex(NULL, FALSE, NULL)
§ Sử dụng
WaitForSingleObject(hMutex, INFINITE)
// … //
ReleaseMutex(hMutex)
§ Ví dụ
§ Đặc điểm
§ Chậm hơn CRITICAL_SECTION
§ Có thể đồng bộ giữa các tiến trình
(7)§ Event dùng đồng bộ hoạt động của các luồng thông qua cơ chế báo
hiệu
§ Sử dụng
§ Khai báo: HANDLE hEvent;
§ Khởi tạo: hMutex = CreateEvent(NULL, TRUE, FALSE, “MyEvent”)
§ Sử dụng
WaitForSingleObject(hEvent, INFINITE)
// …
SetEvent(hEvent) // Báo hiệu các luồng khác
ResetEvent(hEvent) // Chặn các luồng khác
… //
CloseHandle(hEvent)
§ Ví dụ