Tải bản đầy đủ (.pdf) (7 trang)

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

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>Lương  Ánh  Hoàng  </b>



<b>  </b>


<b>Chương  3.  Kiểm  soát  xung  đột  </b>



</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=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  



</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

§  <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ụ  


<b>3.1  Khái  niệm  </b>



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


</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>

§  <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>


</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

§  <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>


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


</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>

§  <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>


</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>

§  <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>


</div>

<!--links-->

×