2016-01-24 29 views
5

Tôi có một mảng dữ liệu khổng lồ, nơi tôi cần đọc/ghi từ/đến vị trí ngẫu nhiên từ các luồng khác nhau. Có một mutex rõ ràng sẽ giết hiệu suất. Ý tưởng của tôi là có nhiều mutexes mỗi người chịu trách nhiệm cho phạm vi cụ thể trong mảng. Bằng cách này trước khi viết, tôi có thể khóa đúng mutex dựa trên chỉ mục trong mảng mà tôi sẽ viết. Về lý thuyết nó có thể làm giảm cuộc đua. Nhưng tôi tự hỏi - có lẽ có một cách tốt hơn?Đọc song song với mảng

+0

Nếu một công nhân đọc vị trí A và sau đó viết vị trí B, làm cách nào để đảm bảo không bị thay đổi ở giữa, làm cho kết quả vô nghĩa? Lý do tôi hỏi là bởi vì nếu có các mẫu truy cập, họ có thể làm cho một cách tiếp cận tốt hơn có thể, ví dụ như một biến thể của mô hình người tiêu dùng sản xuất, được giải quyết tốt nhất bằng cách sử dụng hàng đợi. –

+0

Tôi không thể chắc chắn. Các mẫu không được biết - đó là một số loại đệm sâu. Đó là lý do tại sao đọc và viết nên được thực hiện trong một khóa duy nhất. – nikitablack

+0

Tôi vẫn không hiểu: Bạn có đọc một phần tử, thực hiện một số thao tác trên nó và sau đó viết lại thành phần tử đó không? Nếu đúng như vậy, bạn có thể trích xuất thuật toán chọn các phần tử và sau đó phân phối chúng thông qua một hàng đợi đơn giản của người sản xuất-người tiêu dùng đến các luồng công nhân và tương tự truyền chúng lại để lưu trữ các kết quả. –

Trả lời

4

Điều đó nghe giống như một cách hợp lý để đi.

Có một số điều cần lưu ý, mặc dù:

  1. Bạn nói rằng ý tưởng của bạn là phải có "nhiều mutexes, mỗi người chịu trách nhiệm về phạm vi cụ thể trong mảng". Bạn có lẽ nên xem xét các mẫu truy cập để quyết định cách gán các mục nhập cho các mutex. Nếu chuỗi sẽ có xu hướng hoạt động trên các mục nhập cận cảnh, bạn có thể xem xét gán các mục nhập cho các mutex bằng cách sử dụng một lược đồ khác, ví dụ: chỉ mục mục nhập modulo số lượng các mutex.

  2. Từ kinh nghiệm, lưu ý rằng số lượng mutexes phải được xác định theo số chủ đề chứ không phải kích thước của phạm vi. Tôi đã viết về điều này nhiều hơn trong this question (đó là câu trả lời được chấp nhận, tại thời điểm viết bài này).

  3. Một lần nữa tùy thuộc vào mẫu sử dụng, bạn nên cân nhắc sử dụng khóa đọc/ghi để tránh việc tuần tự hóa không cần thiết cho nhiều người đọc trên cùng một mục nhập. YMMV.

+1

Chỉ là một nhận xét nhỏ cho "điều 1" - nếu chủ đề hoạt động trên các yếu tố lân cận, bạn nên biết [chia sẻ sai] (https://en.wikipedia.org/wiki/False_sharing) – Rostislav

+0

@Rostislav, vâng, cảm ơn - Đó là một điểm tốt. –

+0

@AmiTavory Cảm ơn. Tôi thực sự thích điều này modulo thingy). – nikitablack

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