2009-08-18 5 views
10

Trong một lớp tốt nghiệp, chúng tôi đã phải sử dụng các ẩn dụ để hoàn thành công việc với các chủ đề.sem_init (...): Thông số được chia sẻ cho là gì?

Chúng tôi được hướng dẫn sử dụng sem_init cùng với một loạt các thủ tục sem_ * khác nhưng chúng tôi không được cung cấp nhiều thông tin về chi tiết của từng phương pháp sem_ * này.

Nguyên mẫu (và file header) của sem_initthe following:

#include <semaphore.h> 

int sem_init(sem_t *sem, int pshared, unsigned int value); 

nhưng tôi không hiểu những gì giá trị pshared được sử dụng cho. Theo opengroup.org:

Nếu đối số pshared có một số không phi giá trị, sau đó semaphore được chia sẻ giữa các quá trình; trong trường hợp này, bất kỳ quá trình có thể truy cập vào các semaphore sem có thể sử dụng sem để thực hiện sem_wait(), sem_trywait(), sem_post(), và sem_destroy() hoạt động.

nhưng tôi đoán tôi không hiểu sự khác biệt giữa 1,2, 10, 25, 50000, v.v ... Tôi nghĩ rằng nếu giá trị là 0 thì semaphore không được chia sẻ. (Nhưng sau đó, điểm là gì?)

Làm thế nào để sử dụng một cách thích hợp thông số pshared này?

Trả lời

12

Phiên bản glibc của sem_init (những gì bạn nhận được nếu bạn man sem_init trên Linux) đã cho biết:

"Đối số pshared cho biết semaphore này là trở thành chia sẻ giữa các chủ đề của một quá trình, hoặc giữa các quá trình. "

Vì vậy pshared là một giá trị boolean: trong các giá trị có ý nghĩa thực tiễn được truyền cho nó là false (0) và true (1), mặc dù giá trị bất kỳ phi-0 sẽ được coi như đúng. Nếu bạn vượt qua nó 0 bạn sẽ nhận được một semaphore có thể được truy cập bởi các chủ đề khác trong cùng một quá trình - về cơ bản là một khóa trong quá trình. Bạn có thể sử dụng nó như một mutex, hoặc bạn có thể sử dụng nó một cách tổng quát hơn cho các thuộc tính đếm tài nguyên của một semaphore. Có thể cho rằng nếu pthreads hỗ trợ một API semaphore, bạn sẽ không cần tính năng này của sem_init, nhưng semaphores trong Unix trước pthreads bởi khá một chút thời gian. Sẽ tốt hơn nếu boolean là một kiểu liệt kê nào đó (ví dụ: SEM_PROCESS_PRIVATE vs SEM_PROCESS_SHARED), bởi vì sau đó bạn sẽ không có câu hỏi này, nhưng các semaphores POSIX là một API khá cũ khi những thứ này đi.

+0

Câu trả lời tuyệt vời, cảm ơn bạn đã giải thích. –

+0

Bạn được chào đón nhiều nhất. Cảm ơn bạn đã khen :). – quark

+0

Không phải PC để gọi phiên bản này là thuộc về GLIBC. Đó là POSIX.1-2001. –

1

Tôi sẽ nói rằng không có sự khác biệt đáng kể giữa giá trị s 1, 2, 5, v.v. đối với tham số shared. Có lẽ nó được viết theo cách đó bởi vì khi API được tạo lần đầu tiên, C không có các kiểu boolean.

+0

Vậy điều đó có làm cho API trở nên lỗi thời không? – Sneakyness

+0

Tôi không biết - đôi khi có giá trị trong việc sử dụng API "đã thử và thử nghiệm" cũ hơn. Bạn sẽ phải xem xét nó từ quan điểm của những thứ như hiệu quả và các lỗ hổng bảo mật rõ ràng để nói nếu nó đã thực sự lỗi thời hay không –

+0

Lén lút: Có và không. Không có trong đó Pthreads, sự lựa chọn hiện đại hơn, dường như không có một semaphore thực hiện, vì vậy đối với những trường hợp mà bạn muốn semaphores đó là API bạn cần phải sử dụng. Có, trong hầu hết các trường hợp, các mutex và điều kiện sẽ làm tốt ở vị trí của các semaphores. – quark

1

Đối số được chia sẻ cho biết liệu semaphore này có được chia sẻ giữa các luồng của quy trình hoặc giữa các quy trình hay không.

Nếu pshared có giá trị 0, thì semaphore được chia sẻ giữa các luồng của một quy trình và phải được đặt tại một số địa chỉ hiển thị cho tất cả các chuỗi (ví dụ: biến toàn cục hoặc biến được phân bổ động trên đống.

Nếu chia sẻ không đồng bộ, thì semaphore được chia sẻ giữa các quy trình và phải được đặt trong vùng bộ nhớ dùng chung (xem shm_open (3), mmap (2) và shmget (2)). (Kể từ khi một đứa trẻ được tạo ra bởi ngã ba (2) thừa hưởng ánh xạ bộ nhớ của cha mẹ nó, nó cũng có thể truy cập semaphore.) Bất kỳ quá trình có thể truy cập khu vực bộ nhớ chia sẻ có thể hoạt động trên semaphore sử dụng sem_post (3), sem_wait (3), vv .