01/10/2018, 09:10

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

viết 11:24 ngày 01/10/2018

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

while (1)
{
    sem_wait(&Empty);
    //ghi (nếu empty init > 1 thì có thể có nhiều tiến trình ghi cùng lúc, phải bọc thêm wait(mutex) ... post(mutex)
    sem_post(&Full);
}

while (1)
{
    sem_wait(&Full);
    //đọc (tương tự, nếu empty init > 1 thì full có thể > 1, nên có thể có nhiều tiến trình đọc cùng lúc, phải bọc thêm wait(mutex) ... post(mutex)
    sem_post(&Empty);
}
Bài liên quan
0