2011-09-27 31 views
5

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?

+2

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). –

Trả lời

6

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.

+0

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

+0

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. –

1

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.

2

Đ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)

+0

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

+0

@Invictus: Bạn phải mở tệp để chia sẻ. Mọi thứ khác nên hoạt động. –

4

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á đủ.

+0

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

+0

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. –

+0

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

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