Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.04 MB, 7 trang )
<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>
§ <b>Xung đột</b> 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ụ
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);
§ <b>Đoạn găng (Critical Section)</b> 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.
§ <b>Sử dụng </b>
§ <b>Khai báo: </b> <b> CRITICAL_SECTION</b> cs
§ <b>Khởi tạo: </b> <b> InitializeCriticalSection(&cs) </b>
§ <b>Sử dụng </b>
<b> </b>EnterCriticalSection(&cs)
<b> // Bắt đầu đoạn găng </b>
<b> … </b>
<b> // Kết thúc đoạn găng </b>
<b> </b>LeaveCriticalSection(&cs)
//
DeleteCriticalSection(&cs)
§ <b>Ví dụ </b>
§ <b>Đặc điểm: </b>chỉ có tác dụng trong cùng một tiến trình<b> </b>
§ <b>Đèn hiệu (Semaphore)</b> 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.
§ <b>Sử dụng </b>
§ <b>Khai báo: </b> <b> HANDLE</b> hSemaphore
§ <b>Khởi tạo: </b> <b> hSemaphore = CreateSemaphore(NULL,5,5,NULL) </b>
§ <b>Sử dụng </b>
<b> </b>WaitForSingleObject(hSemaphore, 0L)
<b> // </b>
<b> … </b>
<b> </b>ReleaseSemaphore(hSemaphore,1,NULL)
//
CloseHandle(hSemaphore)
§ <b>Ví dụ </b>
§ <b>Đặc điểm </b>
§ <b>Dùng chung được giữa các tiến trình </b>
§ <b>Tốc độ chậm hơn CRITICAL_SECTION </b>
§ <b>Mutex</b> 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.
§ <b>Sử dụng </b>
§ <b>Khai báo: </b> <b> HANDLE</b> hMutex;
§ <b>Khởi tạo: </b> <b> hMutex = CreateMutex(NULL, FALSE, NULL) </b>
§ <b>Sử dụng </b>
<b> </b>WaitForSingleObject(hMutex, INFINITE)
<b> // </b>
<b> … </b>
<b> // </b>
<b> </b>ReleaseMutex(hMutex)
§ <b>Ví dụ </b>
§ <b>Đặc điểm </b>
§ <b>Chậm hơn CRITICAL_SECTION </b>
§ <b>Có thể đồng bộ giữa các tiến trình </b>
§ <b>Event</b> dùng đồng bộ hoạt động của các luồng thông qua cơ chế báo
hiệu.
§ <b>Sử dụng </b>
§ <b>Khai báo: </b> <b> HANDLE</b> hEvent;
§ <b>Khởi tạo: </b> <b> hMutex = CreateEvent(NULL, TRUE, FALSE, “MyEvent”) </b>
§ <b>Sử dụng </b>
<b> </b>WaitForSingleObject(hEvent, INFINITE)
<b> // </b>
<b> … </b>
<b> SetEvent(hEvent)</b> <b> </b> <b> // Báo hiệu các luồng khác </b>
<b> ResetEvent(hEvent)</b> <b> // Chặn các luồng khác </b>
<b> … </b>
<b> // </b>
<b> </b>CloseHandle(hEvent)
§ <b>Ví dụ </b>