TAILIEUCHUNG - Hệ điều hành Linux - Bài 6b: Lập trình đa tuyến
Nội dung tài liệu trình bày về semaphore, định nghĩa về semaphore, ứng dụng của semaphore, hủy bỏ và chấm dứt tuyến, đối tượng semaphore, cách gọi hàm semaphore, yêu cầu đối số, tuyến song song, hàm thực thi tuyến, khởi tạo tuyến, cài đặt hàm thực thi tuyến, tuyến chính, tạo tuyến, giá trị thiết lập mặc định và yêu cầu chấm dứt tuyến. | Bài 6b LẬP TRÌNH ĐA TUYẾN (tt) 5. Đồng bộ tuyến với semaphore a. Semaphore là gì ? Semaphore thực sự là một cờ hiệu tương tự như mutex, nếu một tuyến cần sử dụng tài nguyên nó thông báo với semaphore. Muốn sử dụng đối tượng semaphore, bạn cần gọi hàm sem_init () để khởi tạo biến semaphore có kiểu cấu trúc sem_t như sau: #include int sem_init (sem_t* sem, int pshareed, unsined int value) Để yêu cầu sử dụng tài nguyên, tuyến thực hiện gọi hàm sem_wait (). Sau khi sử dụng xong tài nguyên tuyến cần gọi hàm sem_post để trả về giá trị của semaphore. #include int sem_wait (sem_t sem); int sem_post (sem_t sem); Cả hai hàm này đều yêu cầu đối số là đối tượng sem đã được hàm sem_init () tạo ra trước đó. b. Ứng dụng của semaphore Bài toán nổi tiếng về tranh chấp tài nguyên dễ hiểu nhất đó là bài toán “sản xuất – tiêu thụ”. Bạn hình dung có hai tuyến song song. Một tuyến chịu trách nhiệm sản xuất ra sản phẩm (producer). Một tuyến có nhiệm vụ lấy sản phẩm để tiêu thụ (comsumer). Nếu sản xuất và tiêu thụ cùng nhịp với nhau thì không có vấn đề gì xảy ra. Tuy nhiên cung, cầu ít bao giờ cần đối và gặp nhau tại một điểm. Ví dụ dưới dây giúp giải quyết vấn đề này. #include #include #include #include #include int product_val = 2; /*Sản phẩm ban đầu trong kho*/ sem_t semaphore; /*Khai báo đối tượng semaphore*/ /*Hàm thực thi tuyến*/ void * do_thread (void* data); int main () { int res, i; pthread_t a_thread; void* thread_result; /*Khởi tạo đối tượng semaphore - Ở đây ta đặt giá trị cho semaphore là 2*/ res = sem_init (&semaphore, 0, 2); if (res != 0) { perror ("Semaphore init error"); exit (EXIT_FAILURE); } /*Khởi tạo tuyến đóng vai trò người tiêu thụ - consumer*/ res = pthread_create (&a_thread, NULL, do_thread, NULL); if (res != 0) { perror ("Thread create error"); exit (EXIT_FAILURE); } /*Tuyến chính đóng vai trò người sản xuất*/ for (i = 0; i int pthread_cancel (pthread_t thread); - Thiết lập trạng thái chấm dứt của tuyến bằng hàm pthread_setcancelstate
đang nạp các trang xem trước