POSIX Semaphores trong C

Posix Semaphores Trong C



“Mặc dù mọi ngôn ngữ lập trình đều có nhiều thư viện cho các mục đích cụ thể, nhưng thư viện POSIX của C có vị trí của nó. Nó được thiết kế để tạo ra sự hài hòa tuyệt vời giữa các quy trình và giúp ích rất nhiều trong việc sử dụng đa luồng trong các chương trình, tức là tạo nhiều luồng và đồng bộ hóa việc thực thi của chúng. Trong hướng dẫn này ngày hôm nay, bạn sẽ thấy một minh họa đơn giản về việc sử dụng các Semaphores POSIX trong C. Đối với các ví dụ mã C cơ bản, chúng ta phải cấu hình trình biên dịch của nó trong hệ thống. Tuy nhiên, trước đó, chúng tôi cần cập nhật hệ thống vì đây là bước cần thiết để thực thi mã trơn tru. Do đó, truy vấn được hiển thị trong snap đính kèm là điều bắt buộc phải có để cập nhật và nâng cấp hệ điều hành Linux của bạn với tiện ích “apt”. ”


Quá trình này yêu cầu khoảng 55 Kb dung lượng trên nền tảng Linux của bạn để thực hiện các bản cập nhật một cách suôn sẻ. Nếu bạn sẵn sàng cung cấp nhiều không gian như vậy, hãy nhấn vào “y” để tiếp tục. Quá trình xử lý sẽ hoàn tất sau vài phút.








Sau khi hệ thống được nâng cấp hoàn toàn, chúng tôi sẽ cấu hình trình biên dịch của ngôn ngữ C trong hệ thống của chúng tôi bằng tiện ích apt-get trong lệnh “install”. Sử dụng “gcc” làm từ khóa và thế là xong.





sem_init ()

Một semaphore mới sẽ được tạo khi đã có một semaphore không xác định tại “s”; nếu không, semaphore đã tồn tại đó sẽ bị loại bỏ. Trong suốt phương thức này, “s” là viết tắt của một cá thể Semaphore đã được xây dựng và được chia sẻ là một tín hiệu hoặc cờ hiệu cho biết liệu semaphore có thể được phân phối bằng phương thức fork () hay không. Giá trị đầu vào đóng vai trò là điểm bắt đầu đã đặt của semaphore.





Int sem_init ( nor_t * s, int shared, unsigned int value ) ;

Sem_wait ()

Bằng cách thực hiện một hành động khóa semaphore trên semaphore được chỉ định bởi “s”, phương thức sem_wait () giữ semaphore đó. Thủ tục sem-wait sẽ được sử dụng để giữ lại một semaphore hoặc để nó đứng trong hàng. Một số tiến trình đã quá tải trước đó sẽ thức tỉnh khi một số tiến trình khác gọi sem_post ().



int sem_wait ( nor_t * S ) ;

Không có bài đăng()

Khi bài đăng được gọi, giá trị được tăng lên, và sau đó một trong các hoạt động đã sao lưu hoặc đang chờ đợi trước đó bắt đầu chạy, tức là mở khóa semaphore đã bị khóa.

int sem_post ( nor_t * S ) ;

no_destroy ()

Một semaphore không tên được khởi tạo “s” bị hủy bằng cách sử dụng hàm sem hủy ().

int sem_destroy ( nor_t * S ) ;

Thí dụ

Để hiểu các semaphores, trước tiên chúng ta sẽ tạo một tệp C và sau đó thêm mã vào đó. Để tạo một tệp, hãy sử dụng truy vấn “chạm” và bạn sẽ tìm thấy tệp mới trong thư mục chính của hệ thống.


Bây giờ, bạn phải mở tệp C trống của mình bằng một số trình soạn thảo đơn giản để tạo mã tốt trong đó. Chúng tôi đã thử trình chỉnh sửa “nano” cho đến nay, như được hiển thị trong phần tích tắc bên dưới.


Như chúng ta đều biết rằng tất cả các ngôn ngữ lập trình không thể hoạt động nếu không có thư viện vì các thư viện này chứa một số lượng lớn các lớp, cấu trúc, hàm và đối tượng được sử dụng cho hoạt động tổng thể của hệ thống. Vì vậy, chúng tôi đang bắt đầu chương trình C này với việc sử dụng một số thư viện cơ bản và bắt buộc phải có cho Hội thảo POSIX.

Để sử dụng các thư viện này trong mã, chúng ta phải sử dụng ký tự “#” với từ khóa “bao gồm” cho mỗi thư viện. Ngay bây giờ, chúng tôi đã thêm tổng cộng 4 thư viện phải có trong chương trình này. Nếu không, chương trình của chúng tôi sẽ không hoạt động chính xác. Thư viện tiêu đề “stdio.h” đầu tiên thường là thư viện bắt buộc phải có trong mọi chương trình C vì nó cho phép chúng ta thực hiện các thao tác nhập và xuất trong mã. Do đó, chúng tôi đang sử dụng nó để thêm đầu vào và nhận đầu ra từ mã một cách suôn sẻ. Thư viện thứ hai mà chúng tôi đang sử dụng ở đây là “pthread.h” là thư viện bắt buộc để sử dụng lập trình luồng, tức là đa luồng.

Chúng tôi sẽ sử dụng thư viện này để tạo các luồng trong một chương trình. Thư viện tiếp theo và quan trọng nhất trong mã này là “semaphore.h”. Nó đã được sử dụng để đồng bộ hóa các luồng một cách trơn tru. Cuối cùng nhưng không kém phần quan trọng, thư viện là “unistd.h”, cho phép chúng tôi sử dụng các hàm và hằng số linh tinh do người dùng định nghĩa. Bây giờ, chúng ta đã khai báo semaphore “s” bằng cách sử dụng đối tượng dựng sẵn “sem_t” của thư viện semaphore. Ở đây có hàm do người dùng xác định chủ đề “T” không có kiểu trả về. Nó đã được sử dụng một số hàm semaphore tích hợp để thực hiện đồng bộ hóa. Hàm sem_wait () ở đây để giữ “s” semaphore bằng cách sử dụng ký tự “&”.

Trong lệnh giữ, câu lệnh printf () được thực thi cùng với hàm “sleep” để làm cho chương trình này ở chế độ ngủ trong 4 giây. Một câu lệnh printf () khác hiển thị một thông báo mới và hàm sem_post () được thực thi để giải phóng khóa trên semaphore “s.”

#include
#include
#include
#include
không s;
vô hiệu * T ( vô hiệu * tranh luận ) {
sem_wait ( & S ) ;
printf ( 'Chào mừng! \N ' ) ;
ngủ ( 4 ) ;
printf ( 'Từ biệt! \N ' ) ;
sem_post ( & S ) ;
}



Chúng ta hãy xem xét kỹ phương thức main () của chương trình C này cho các semaphores. Hàm sem_init () đã được sử dụng ở đây để tạo một “s” semaphore mới chưa được phân phối với phương thức forked (), tức là “0” và điểm bắt đầu của nó được đặt thành 1. Đối tượng pthread_t từ pthread thư viện của C đã được sử dụng để tạo hai luồng bằng cách sử dụng hai đối tượng luồng, o1 và o2. Câu lệnh printf () ở đây để hiển thị rằng chúng ta sẽ tạo luồng đầu tiên bằng cách sử dụng hàm pthread_create () ở dòng tiếp theo.

Chúng tôi đã truyền đối tượng luồng o1 cho hàm này với các hạn chế NULL và gọi hàm “T” bằng cách chuyển nó vào các tham số. Sau khi ngủ 4 giây, một luồng khác đã được tạo với đối tượng o2 và hàm pthread_join () được sử dụng ở đây để nối các luồng với một hàm main (). Hàm sem_destroy () ở đây để hủy semaphore “s” và tất cả các luồng bị chặn cũng sẽ được giải phóng.

int main ( ) {
sem_init ( & S, 0 , 1 ) ;
pthread_t o1, o2;
printf ( 'Trong Chủ đề đầu tiên bây giờ ... \N ' ) ;
pthread_create ( & o1, NULL, T, NULL ) ;
ngủ ( 4 ) ;
printf ( 'Trong Chủ đề thứ 2 bây giờ ... \N ' ) ;
pthread_create ( & o2, NULL, T, NULL ) ;
pthread_join ( o1, NULL ) ;
pthread_join ( o2, NULL ) ;
no_destroy ( & S ) ;
trở về 0 ;
}



Chúng tôi đang biên dịch chương trình C bằng trình biên dịch “Gcc”; các tùy chọn “-lrt” và “-lpthread” được sử dụng để thực thi các chức năng luồng POSIX. Khi chạy truy vấn “.a / .out”, luồng đầu tiên đã được tạo. Nó sẽ chuyển sang chế độ ngủ sau khi in tin nhắn đầu tiên.


Luồng thứ hai được đồng bộ hóa và sau 4 giây, luồng đầu tiên được giải phóng và luồng thứ hai bị khóa trong 4 giây.


Cuối cùng, chủ đề thứ hai cũng được phát hành.

Sự kết luận

Đó là về POSIX Semaphores trong C trong khi sử dụng một số chức năng chính của nó để đồng bộ hóa các luồng khác nhau. Sau khi xem qua bài viết này, bạn sẽ có thể hiểu rõ hơn về POSIX.