Tôi đang viết mã bằng C++. Tôi có thể chạy vào bất kỳ loại điều kiện chủng tộc hoặc lỗi seg nào không?Có thể nhiều luồng ghi vào một tập tin cùng một lúc, nếu tất cả các luồng được ghi vào các vị trí khác nhau?
Trả lời
Không có vấn đề gì khi thực hiện điều đó từ quan điểm của hệ thống cơ bản (đối với tất cả các hệ thống mà tôi biết). Tuy nhiên, thông thường bạn sẽ cần phải có hoàn toàn riêng biệt mô tả tập tin/xử lý. Điều này là do trình mô tả tệp duy trì trạng thái, ví dụ: vị trí tệp hiện tại.
Bạn cũng cần kiểm tra độ an toàn của giao diện C++ cụ thể đến hệ thống tệp bạn đang sử dụng. Điều này là cần thiết ngoài các thread-an toàn của hệ thống tập tin cơ bản.
Bạn cũng nên xem xét khả năng luồng I/O được tạo luồng sẽ chậm hơn. Hệ thống có thể phải nối tiếp truy cập vào bus. Bạn có thể nhận được hiệu suất tốt hơn từ I/O chồng lên nhau hoặc một luồng I/O chuyên dụng được cung cấp thông qua đường ống của nhà sản xuất/người tiêu dùng.
Trong mỗi chủ đề tôi mở cùng một tệp và sau đó ghi vào tệp theo vị trí khác nhau cho mỗi chuỗi. Vì vậy, tôi có thể tiếp tục và thực hiện đúng ??? – Invictus
Tôi không thể nói chắc chắn. Bạn đã không hiển thị mã của mình. Nhưng miễn là bạn có tay cầm khác nhau, bạn nên ổn. –
Chắc chắn bạn có thể. Điều kiện cuộc đua có thể xảy ra tùy thuộc vào cách bạn đang viết mã thực tế (tức là sử dụng tệp đó). Ngoài ra, nếu IO được đệm những thứ lạ có thể xuất hiện nếu vùng đệm được chồng lên nhau.
Điều đó tùy thuộc. Tệp không phải là tay cầm của chúng và luồng không phải là tệp. Ba khái niệm khác nhau này phải rõ ràng.
Bây giờ, hệ điều hành có thể mở tệp nhiều lần hơn để xử lý các điều khiển khác nhau, mỗi cái có "con trỏ vị trí" riêng của nó. Nếu tập tin được mở trong "chế độ chia sẻ" cho cả đọc và viết, bạn có thể tìm kiếm các tay cầm ở nơi bạn muốn và đọc/ghi theo ý muốn. Thực tế bạn không ghi đè tùy thuộc vào bạn. Hệ thống cấp tính tuần tự của các hoạt động cho toàn bộ tệp hoặc cho một phần của nó (nhưng cần thêm thông tin về hệ điều hành)
Nếu mọi xử lý được gắn vào một luồng khác, mỗi luồng sẽ ghi độc lập với khác. Nhưng trong trường hợp này - có sự phức tạp của "đệm" (viết có thể bị trì hoãn và đọc có thể được dự đoán: và có thể dài hơn khi bạn hỏi: đảm bảo bạn quản lý chồng chéo đúng cách bằng cách xả theo thích hợp)
Trong mỗi chủ đề tôi mở cùng một tệp và sau đó ghi vào tệp theo vị trí khác nhau cho mỗi chuỗi. Vì vậy, tôi có thể tiếp tục và thực hiện đúng ??? – Invictus
@Invictus: Bạn phải mở tệp để chia sẻ. Mọi thứ khác nên hoạt động. –
Một giải pháp khác, tùy thuộc vào kích thước của tệp và hệ thống bạn đang chạy, là sử dụng memory mapped files, tức là. ánh xạ tệp vào bộ nhớ ảo. Điều này sẽ cho phép bạn truy cập trực tiếp vào tệp như thể đó là một phần của bộ nhớ. Bằng cách này, bất kỳ số lượng các chủ đề chỉ đơn giản là có thể ghi vào vùng bộ nhớ và các cuộc gọi tiếp theo để tuôn ra ánh xạ vào đĩa (tùy thuộc vào cấu hình của bản đồ bộ nhớ) sẽ chỉ lưu trữ dữ liệu trên đĩa. Lưu ý, do hạn chế địa chỉ trên nền tảng 32 bit, bạn sẽ không thể ánh xạ bất kỳ tệp nào lớn hơn 2-3 GB, tùy thuộc vào kiến trúc và số bit thực tế có sẵn để thực hiện ảo bộ nhớ địa chỉ. Hầu hết các hệ thống 64 bit đều có 48 bit hoặc nhiều hơn cho tác vụ này, cho phép bạn lập bản đồ ít nhất 256 TB, điều tôi muốn làm là quá đủ.
Tôi đang có một hệ điều hành freebsd, vì vậy, bạn có nghĩ rằng tôi có thể sử dụng bản đồ bộ nhớ? – Invictus
Có. Hầu như tất cả các UNIX hiện đại đều hỗ trợ ánh xạ bộ nhớ thông qua hàm 'mmap'. Trang _man_ cung cấp nhiều chi tiết hơn về nó, trong trường hợp của bạn sẽ là [như thế này] (http://nixdoc.net/man-pages/FreeBSD/mmap.2.html). Nói chung, các bước cần thiết chỉ đơn giản là mở một bộ mô tả tập tin, preallocate kích thước của nó nếu cần thiết (bằng tay hoặc thông qua fallocate hoặc posix_fallocate) và sau đó ánh xạ nó vào bộ nhớ và bạn tốt để đi. –
Nhưng, vấn đề ở đây là tôi sử dụng một bảng băm để lưu trữ dữ liệu đến, và, tôi muốn viết nó vào tập tin đầu ra ... Vậy, có cách nào không ??? – Invictus
- 1. Nhiều luồng có thể ghi dữ liệu vào một tệp cùng lúc không?
- 2. Linux File IO - Đa luồng hiệu năng - ghi vào các tập tin khác nhau
- 3. Đồng thời ghi vào các vị trí khác nhau trong cùng một dòng bộ nhớ cache
- 4. là < vector > luồng an toàn để đọc/ghi tại các vị trí khác nhau?
- 5. Ghi vào một luồng như thể nó là một tập tin, nhưng thực sự ghi vào một đối tượng
- 6. Log4j - Có nhiều appenders ghi vào tập tin cùng với một trong đó luôn ghi lại
- 7. Bạn có thể ghi vào luồng đầu vào và đầu ra của ổ cắm cùng một lúc không?
- 8. Hibernate: Tránh đọc tất cả các bản ghi vào bộ nhớ cùng một lúc
- 9. In ra màn hình và ghi vào một tập tin cùng một lúc
- 10. Có thể đọc và ghi vào tập tin cùng lúc không?
- 11. Cách ghi luồng vào tệp?
- 12. htaccess ghi đè tất cả các trang vào cùng một trang trên một tên miền khác
- 13. Đọc và Ghi vào một tập tin cùng một lúc trong java
- 14. Có thể một Byte [] Array được ghi vào một tập tin trong C#?
- 15. Đồng thời Java - ghi vào các chỉ mục khác nhau của cùng một mảng
- 16. Truy cập đa luồng vào tập tin
- 17. UnicodeEncodeError khi ghi vào một tập tin
- 18. Buộc goroutines vào cùng một luồng
- 19. ngăn phương thức thực thi từ các luồng khác nhau cùng một lúc
- 20. Ghi vào một tập tin trong Clojure
- 21. Làm cách nào để kết hợp nhiều luồng âm thanh vào một luồng được ghi bằng Java?
- 22. Ghi tệp vào các vị trí tạm thời
- 23. Hai quy trình đọc/ghi vào cùng một tệp Python
- 24. Làm thế nào tôi có thể xóa tất cả các bản ghi từ một TClientDataset cùng một lúc?
- 25. Tìm kiếm solitaire Sunspot, cách trả lại tất cả các bản ghi cùng một lúc?
- 26. ghi lại các tập lệnh được lưu tại vị trí
- 27. log4net + nhiều luồng + lăn appender tập tin
- 28. Có thể tuần tự hóa cùng một đối tượng tạo ra các luồng khác nhau không?
- 29. Làm thế nào để bạn chèn nhiều bản ghi vào một bảng cùng một lúc?
- 30. Ghi dữ liệu VMStat vào tập tin
Nếu bạn cần truy cập tệp đồng thời không tuần tự, tôi khuyên bạn nên sử dụng tệp ánh xạ bộ nhớ thay thế. Sau đó, chỉ xử lý nó như bộ nhớ bình thường và làm khóa của riêng bạn (mà không cần thiết nếu bạn có thể đảm bảo các vị trí ghi/đọc không chồng lên nhau). –