2010-03-01 42 views
15

Tôi đang sử dụng cả API socket Linux và Win32. Trong chương trình của tôi, nhiều luồng chia sẻ một socket handle. Cụ thể, nhiều chủ đề gọi send bằng tay cầm socket được chia sẻ (tức là, cùng một cổng). Trong trường hợp này, tôi có phải đặt khóa cho an toàn luồng không? Tôi không thể tìm ra câu trả lời. Tôi có thể làm một bài kiểm tra, nhưng muốn nghe kinh nghiệm của bạn.C socket API có an toàn không?

EDIT: Tôi biết rằng dữ liệu gửi qua ổ cắm đó không phải là hoạt động nguyên tử chút nào. Chắc chắn chúng ta phải sử dụng một mutex cho an toàn thread. Tuy nhiên, tôi đã tự hỏi liệu các API hệ thống có thể có khóa nội bộ riêng của họ. Nếu vậy, chúng ta có thể bỏ qua việc đặt khóa riêng của mình.

Câu hỏi này cũng có thể áp dụng cho chức năng fprintf. Tôi tự hỏi các API hệ thống như vậy sẽ có khóa riêng của chúng. Theo kinh nghiệm của tôi, gọi fprintf từ nhiều chủ đề không giết chương trình của tôi mặc dù đã có các cuộc đua trên một tệp hoặc thiết bị xuất chuẩn (tức là các kết quả không nhất quán hoặc không thể đoán trước được, nhưng chương trình không bị lỗi), ngụ ý fprintf có khóa để bảo vệ nội bộ của chúng cấu trúc dữ liệu.

+0

Nhiều chủ đề đọc và ghi vào cùng một socket, theo ý kiến ​​của tôi, một vấn đề thiết kế thực tế. – theMayer

Trả lời

0

Gửi dữ liệu qua ổ cắm không phải là giao dịch nguyên tử - mọi giao dịch phi nguyên tử sẽ yêu cầu khóa/đồng bộ hóa. Điều này là độc lập với nền tảng này.

+1

Cảm ơn. Vâng, tôi biết rằng đây không phải là hoạt động nguyên tử chút nào. Tuy nhiên, tôi đã tự hỏi liệu các API hệ thống có thể có khóa nội bộ riêng của họ. – minjang

+4

Nhưng nếu họ đã làm điều đó sẽ làm cho họ nguyên tử ... – EJP

11

Ổ cắm không thuộc tiêu chuẩn C++ nên nó phụ thuộc vào việc triển khai. Nói chung chúng không phải là chủ đề an toàn vì send không phải là một hoạt động nguyên tử. Kiểm tra this discussion để biết thêm thông tin.

EDIT: Hệ điều hành có thể có hoặc không thể có khóa bên trong để bảo vệ cấu trúc bên trong. Nó phụ thuộc vào việc thực hiện. Vì vậy, bạn không nên dựa vào nó.

+0

Âm thanh như gửi/recv POSIX là chủ đề an toàn dựa trên liên kết của bạn và về cuộc thảo luận này: http://stackoverflow.com/a/1981439/602245 – Brett

0

Không, biến được tạo bằng chấp nhận không cần phải là mutex. Bất kỳ dữ liệu được sử dụng bởi các chủ đề nên ít nhất là semaphores.

sem_t* sem_data; 
2

Tôi tìm thấy bộ mô tả tập tin chứa nhiều socket() cực kỳ nguy hiểm trong môi trường đồng thời.

Thông thường nhiều cuộc gọi bị bỏ qua, nhưng trong trường hợp chủ đề khác mở một bộ mô tả tệp khác, thường thì nó được mô tả tệp trước và bắt đầu cơn ác mộng.