2009-02-27 20 views
7

Có an toàn chỉ bằng fprintf không? The glibc manual có vẻ như nó là, nhưng ứng dụng của tôi, mà viết vào một tập tin bằng cách sử dụng một cuộc gọi duy nhất để fprintf() có vẻ là intermingling viết một phần từ các quá trình khác nhau.Có phải thực hiện glibc của fprintf() thread-safe không?

chỉnh sửa: Để làm rõ, chương trình được đề cập là plugin lighttpd và máy chủ đang chạy với nhiều chuỗi công việc.

Nhìn vào tệp, một số ghi được xen kẽ.

chỉnh sửa 2: Có vẻ như vấn đề tôi nhìn thấy có thể là do "đề người lao động" lighttpd của quy trình riêng biệt thực sự là: http://redmine.lighttpd.net/wiki/lighttpd/Docs:MultiProcessor

vấn đề

Bằng cách chạy 2 hoặc nhiều hơn các quá trình trên cùng một ổ cắm, bạn sẽ có đồng thời tốt hơn , nhưng sẽ có một vài hạn chế mà bạn phải biết của:

  • mod_accesslog có thể tạo nhật ký truy cập bị hỏng, vì cùng một tệp được mở hai lần và KHÔNG được đồng bộ hóa.
  • mod_status sẽ có n các bộ đếm riêng biệt, một bộ cho mỗi quy trình .
  • mod_rrdtool sẽ không thành công vì nhận được cùng một dấu thời gian hai lần.
  • mod_uploadprogress sẽ không hiển thị trạng thái chính xác.
+0

Bạn có đang quan sát điều này trong tệp mà bạn viết bằng 'fprintf' hoặc bạn đang quan sát điều này trong luồng' stdout' và 'stderr'? –

Trả lời

14

Bạn đang nhầm lẫn hai khái niệm - viết từ nhiều chủ đề và viết từ nhiều quy trình. Bên trong một quá trình có thể để đảm bảo rằng một invocation của fprintf được hoàn thành trước khi tiếp theo được phép truy cập vào bộ đệm đầu ra, nhưng một khi ứng dụng của bạn bơm đầu ra cho một tập tin bạn đang ở lòng thương xót của hệ điều hành. Nếu không có một số loại cơ chế khóa dựa trên hệ điều hành, bạn không thể đảm bảo rằng một ứng dụng hoàn toàn khác không ghi vào tệp nhật ký của bạn.

7

Âm thanh với tôi như bạn cần đọc trên file locking. Vấn đề bạn có là nhiều quá trình (tức là không phải chủ đề) đang ghi vào cùng một tệp cùng một lúc và không có cách nào đáng tin cậy để đảm bảo viết sẽ là nguyên tử. Điều này có thể dẫn đến các tập tin ghi đè lên viết của nhau, đầu ra hỗn hợp, và hoàn toàn không xác định hành vi.

Điều này không liên quan gì đến Chủ đề an toàn, vì điều này chỉ có liên quan trong các chương trình xử lý đa luồng đơn.

2

Chuẩn C++ hiện tại không nói gì hữu ích về đồng thời, cũng như tiêu chuẩn C năm 1990. (Tôi đã không đọc tiêu chuẩn C năm 1999, vì vậy không thể bình luận về nó; chuẩn C++ 0x sắp tới không nói những điều, nhưng tôi không biết chính xác những gì offhand.)

Điều này có nghĩa là fprintf () bản thân nó có khả năng không an toàn cho luồng hay cách khác, và nó sẽ phụ thuộc vào việc thực hiện. Tôi đã đọc chính xác những gì tài liệu glibc nói về nó, và so sánh nó với chính xác những gì bạn đang làm.

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