2010-02-23 28 views
5

Có phải là inet_aton An toàn chủ đề không? Tôi biết theo UNP rằng POSIX không đòi hỏi nhiều API Sockets phải là chủ đề an toàn, và vì vậy tôi phải thừa nhận rằng chúng không phải là chủ đề, nhưng nói chung làm cách nào để biết liệu có gì đó là thread an toàn trong Perl không? Tôi cần phải khóa chức năng thư viện mà tôi gọi ở mức độ nào? Và làm cách nào để khóa chúng? Khi tôi thử một cái gì đó như lock(&inet_aton) nó mang lại cho tôi một lỗi: Can't modify non-lvalue subroutine call in lock.Có phải là an toàn thread inet_aton của Perl không?

Và vâng, tôi đã đọc: Thread-Safety of System Libraries

Trả lời

2

Nếu bạn đọc inet_aton manpage một cách cẩn thận, bạn sẽ thấy rằng cuộc gọi này không sử dụng bất kỳ nhà nước chia sẻ (trái với inet_ntoa chức năng được mô tả trong manpage giống nhau), và do đó nên là chủ đề an toàn.

Chức năng ghi kết quả của nó vào cấu trúc do người gọi cung cấp cũng hỗ trợ điều này.

Sử dụng Perl a thin wrapper on top of those functions và do đó không thay đổi độ an toàn của thư viện cơ bản.

+0

Vì vậy, nói chung, làm thế nào để đánh giá an toàn chủ đề liên quan đến các cuộc gọi thư viện? Tôi đọc điều này về sự reentrancy trong POSIX: http://www.unix.org/whitepapers/reentrant.html Dường như chỉ ra dữ liệu/trạng thái tĩnh là điều chính cần tìm. Tôi đoán tôi chỉ cần kiểm tra trên một func bởi cơ sở func. Vì vậy, nếu tôi cần ví dụ để gọi 'inet_ntoa' làm thế nào tôi có thể khóa nó? –

2

Chức năng inet_aton không có bất kỳ trạng thái nào giữa các cuộc gọi hàm, vì vậy tôi không thấy bất kỳ lý do nào tại sao nó không phải là chủ đề an toàn (miễn là đối số bạn vượt qua không được chia sẻ giữa các chủ đề).

+1

Việc sử dụng các biến tĩnh toàn cục hoặc trạng thái bên ngoài toàn cầu (ví dụ: đồng hồ phần cứng), thậm chí không có trạng thái statefulness, tôi tin là một vấn đề tiềm ẩn. – mctylr

Các vấn đề liên quan