Bạn hiểu như thế là sai về semaphore rồi.

Vì hai function P và V là global, nên điều kiện để thoát ra khỏi vòng lặp wait() là như nhau (trừ một số trường hợp rất đặc biệt người ta mới làm khác, nhưng như thế sẽ rất dễ gây deadlock, và khó quản lý). Để dễ hiểu, bạn hiểu P() nghĩa là : xin được vào xếp hàng, còn V() nghĩa là : thông báo cho người khác là mày được chạy rồi đấy. Do mình ko học ở VN, nhưng có một đứa em học CNTT ở nhà. Khi mình giảng bài cho nó thì thấy là nhiều giáo viên ở nhà khi cho bài tập cho học sinh thường dịch từ sách tiếng anh ra (hoặc bản thân quyển sách đấy là tiếng việt nhưng gốc là tiếng anh, và giáo viên thì ko để ý kỹ trước khi cho học sinh làm bài _ và người dịch sách lại ko có chuyên môn) nên đầu bài thường rất tối nghĩa, và nếu không đọc trước được các ví dụ mà giáo viên đã giảng ở trên lớp, hoặc note của thầy thì khó mà hiểu được. Mình thực sự ko hiểu được đầu bài của bạn. Nhưng mình nói tóm tắt lại về cơ bản của semaphore, hy vọng bạn dựa vào đó và các ví dụ của thầy đã cho để tự làm được bài. semaphore là một biến thể của mutex, và được dùng để quản lý việc truy cập vào một cái dữ liệu nào đó (ví dụ như ko cho phép nhiều người cùng dùng máy in như bài của bạn). 1) Dạng đơn giản nhất là semaphore chỉ có một biến, và mang 2 giá trị true hoặc false. Khi đó thì semaphore giống hệt như mutex với lock vầ unlock. Khi một thread chạy đến đoạn cần access cái resource đấy, nó check cái giá trị của semaphore, nếu là true, thì nó chuyển cái giá trị đấy thành false (lock), rồi vào access cái dữ liệu đấy. Sau khi xong nó sẽ chuyển ngược lại thành true (unlock) để người khác có thể vào sử dụng. 2) Nâng cấp lên một chút, tức là vẫn chỉ có một semaphore, nhưng semaphore có thể có nhiều giá trị. Ví dụ như cái máy in của bạn, cho phép 3 người làm việc cùng lúc. Thế thì cái semaphore lúc đầu sẽ có giá trị là 3. Mỗi khi có một người đến xin làm việc, nó giảm xuống 1, và đến người thứ 4 (3 người kia vẫn chưa làm xong) thì semaphore có giá trị là 0 và không cho người thứ 4 vào làm việc. Khi đấy người thứ 4 sẽ phải đợi 1 trong ba người kia làm xong, và khi làm xong họ sẽ tăng cái giá trị semaphore lên 1, để thông báo. 3) Ứng dụng thứ 3 phức tạp hơn một chút, chính là bài tập của bạn. Thường được sử dụng khi một task muốn access một cái resource nào đấy, nhưng chỉ khi mà một task khác đã access nó xong. Ví dụ: task A chạy đến đoạn cần phải dùng cái resource đấy, và nó xin request được access, bằng cách so sánh cái semaphore của nó với một giá trị nào đấy (thường là 0). Nếu nó lớn hơn 0 thì nó chạy, còn ko thì đợi. Sau khi nó chạy xong thì nó sẽ thông báo cho người khác biết là mày được chạy rồi đấy, bằng cách tăng semaphore của người mà nó muốn thông báo. Ứng dụng thứ 3 này hữu ích, nhưng dễ gây deadlock, đấy là khi tất cả semaphore đều ko thể access được cái resource. Theo cách hiểu như mình mô tả thì mỗi lần call P() tương ứng với một lần xin được access cái resource đấy, và mỗi lần call V() tương ứng với việc thông báo cho người khác

Và bạn hình dung là mỗi thread ko phải được chạy cùng lúc. và có thể một thread chạy hết một vòng rồi lại lặp lại. Vì thế nếu mình hiểu cái đầu bài của bạn đúng thì .biết mình đã chạy xong rồi. cái nào cũng gây deadlock được cả :( . mà chạy với các thời gian khác nhau..

Sign up to vote on this title
UsefulNot useful