Cơ bản về Mutex

– Mutex chỉ có 2 trạng thái, busy và free. khi một thread sử dụng mutex thì system đưa mutex vào trạng thái busy và tất nhiên ko còn thread nào có khả tăng tương tác với cái muxtex này nữa. Do đó nó chỉ được free (unlock )bởi chính cái thread mà đã lock nó.

– Còn một đặc điểm nữa mà bạn cần lưu ý là khi dùng muxtex, một khi một thread đã lock (đưa vào trạng thại busy) một mutex thì các thread khác khi đòi quyền truy cập muxtex sẽ được đưa vào trạng thái sleep để tránh busy wait (không tiêu tốn tài nguyên CPU khi chờ muxtex được unlock). Khi muxtex được unlock thì system sẽ wake up các thread đang chờ.

Còn đối với semaphore, các thread khác đòi quyền truy cập được đưa vào trạng thái sleep khi token = 0. Do đó việc +1 vào semaphore sẽ được thực hiện bởi nhiều thread khác nhau. Còn khi dùng mutex bạn chỉ được +1 bởi cái thread mà đã -1.

Binary Semaphore là gì?

  • Semaphore khi khởi tạo sẽ được cài đặt số lượng truy cập cho phép, ví dụ là 4. Khi một thread sử dụng có thể tăng hoặc giảm giá trị này . Miễn sao giá trị này còn 4>=k>=0 . Có nhiều thread truy cập và sử dụng semaphore cùng lúc miễn là k > 0. Bài toán nổi tiếng của semaphore là bài toán người sản xuât – người tiêu thụ, các thread sản xuất sẽ + 1 vào semaphore, Thread tiêu thụ sẽ -1 khỏi semaphore.
  • Binary Semaphore là trường hợp đặc biệt với n = 1. Về chức năng thì giống như mutex , nhưng khác về bản chất là tất cả các thread khác nhau có thể truy cập được đối này.

Khi nào dùng Mutex và Binary Semaphore

  • Lấy bài toán thế này cho dễ hiểu. Bạn có.
    – Thread A : cứ 2.2 giây làm ra được 1 ổ bánh mì.
    – Thread B: cứ 3.5 giây tạo ra được 1 ổ bánh mì.
  • Thread C lúc nào cũng muốn mua bánh mì, và cứ 1 giây nó chạy tới cái tiệm để coi có bánh mì không để mua.
  • Vấn đề là Thead A và B làm bánh mì quá chậm, Thread C sẽ có lúc đi tới tiệm mà không có bánh mì, làm tốn công nó đi (tốn tài nguyên CPU).
  • Nếu dùng mutex, Thread A làm xong 1 ổ bánh mì thằng B mới được làm bánh mình, hoặc thread C mới được mua. Vì khi nó sài mutex thì mấy thằng khác ngồi nhìn.
  • Giờ nếu dùng bin semaphore. Thằng A làm xong +1 vào semaphore Thằng C thấy semaphore lớn hơn 0 nên chạy tới mua. Đang chạy nữa đường thằng B +1 vào semaphone, thằng C vừa về cất bánh mì thì chạy tiếp tới mua.
    Bạn thấy cách nào hiệu quả hơn ?

Code demo cho semaphore

Bạn nào sài Linux thì tải file này về, giải nén, vào thư mục, gõ lệnh make thì có chương tình ngay để test nhé !