1. Trang chủ
  2. » Mầm non - Tiểu học

Bài giảng Lập trình an toàn: Chương 3 - Lương Ánh Hoàng - Trường Đại Học Quốc Tế Hồng Bàng

7 31 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Nội dung

[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ụ  

Ngày đăng: 01/04/2021, 16:20

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w