Vấn đề khi dùng semaphore bằng C
Chào các bác, em đang tập tành dùng cái semaphore để đọc ghi mảng.
Em có đọc trong tài liệu là dùng 3 con semaphore, 1 con để quản lý mảng có đầy không, 1 con để quản lý mảng trống hay không, và 1 con để lock ( Đang ghi thì không được đọc ).
Nhưng vấn đề nảy sinh như thế này:
Hàm sem_post sẽ dùng để đánh thức thằng sem_wait (ngủ). Nhưng khi vào vùng critical section, tức là con sem Lock phải khóa lại, ghi, sau đó mở ra. Nhưng code lại như thế này:
Đây là tiến trình đọc
sem_wait(&Lock);
Đọc
sem_post(&Lock);
Tiến trình ghi
sem_wait(&Lock);
Ghi
sem_post(&Lock);
Vậy thằng nào sẽ gọi thằng nào, và nếu như mới vào cả 2 tiến trình mà wait cả thì ngủ luôn phải không ạ? Em thắc mắc đoạn này.
Em đã thử debug để xem cách nó chạy thì nó bỏ qua con sem_wait(&Lock) nhảy vào tiến trình ghi mảng luôn
Đây là code: https://anotepad.com/notes/ican9w , mong các bác giải thích dùm em.
Còn video dưới đây là quá trình em thử chạy, thì thấy có điều lạ, lẽ ra theo quy trình của code em là ghi -> đọc liền dù 2 thread chạy song song, nhưng vẫn đảm bảo là, ghi xong mới đọc. Nhưng nhiều lần ghi xong, bắt ghi lại mới đọc, thật là khó hiểu :<
ghi xong vẫn đòi ghi tiếp là do con sem
Empty
được init giá trị = n:sem_init(&Empty,0,n);
. Init như vậy thì có thể ghi nhiều lần liên tục rồi mới đọc. Muốn lần lượt thì init nó về 1 là xong. Với lại bỏ hết mấy cái if else count đi, count để làm gì vậy??