2010-05-05 31 views
8

Tôi có cấu trúc cây lớn mà trên đó một số luồng đang hoạt động cùng một lúc. Lý tưởng nhất, tôi muốn có một khóa mutex cá nhân cho mỗi tế bào.Sử dụng nhiều khóa mutex

Tôi đã xem định nghĩa pthread_mutex_t trong bits/pthreadtypes.h và nó khá ngắn nên việc sử dụng bộ nhớ không phải là vấn đề trong trường hợp của tôi.

Tuy nhiên, có bất kỳ hình phạt hiệu suất nào khi sử dụng nhiều (giả sử một vài nghìn) khác nhau pthread_mutex_t s chỉ trong 8 chủ đề?

+0

Một vài nghìn trên một cây duy nhất là .. loại có vấn đề .. nhưng khó nói mà không thực sự nhìn thấy nó. Bạn có thể đăng đủ mã để hiển thị một ví dụ hợp lý về những gì bạn đang làm không? –

Trả lời

8

Nếu bạn đang khóa và mở khóa rất thường xuyên, có thể bị phạt, vì việc lấy và nhả khóa sẽ mất một thời gian và có thể mất một khoảng thời gian hợp lý nếu khóa bị khóa.

Khi sử dụng nhiều ổ khóa trong cấu trúc như thế này, bạn sẽ phải rất cụ thể về những gì mỗi khóa thực sự khóa và đảm bảo bạn cẩn thận với khóa chết AB-BA. Ví dụ, nếu bạn đang thay đổi cấu trúc của cây trong quá trình khóa, bạn sẽ cần phải khóa tất cả các nút sẽ được thay đổi, theo thứ tự nhất quán và đảm bảo rằng các chuỗi làm việc trên con cháu không bị lẫn lộn.

Nếu bạn có số lượng khóa lớn, trải rộng trên bộ nhớ, các sự cố bộ nhớ đệm có thể gây ra vấn đề về hiệu năng, tùy thuộc vào kiến ​​trúc, vì thao tác khóa thường sẽ làm mất hiệu lực ít nhất một phần bộ nhớ cache.

Đặt cược tốt nhất của bạn có thể là thực hiện một cấu trúc khóa đơn giản, sau đó cấu hình nó, sau đó tinh chỉnh nó để cải thiện hiệu suất, nếu cần thiết. Tôi không chắc những gì bạn đang làm với cây, nhưng một nơi tốt để bắt đầu có thể là một khóa đọc độc giả cho toàn bộ cây, nếu bạn mong đợi để đọc nhiều hơn bạn cập nhật.

"Chúng ta nên quên hiệu quả nhỏ, nói khoảng 97% thời gian: tối ưu hóa sớm là gốc rễ của mọi điều ác". - Donald Knuth

+1

+1 - Câu trả lời hay. –

0

Mẫu khóa/truy cập của bạn cần phải được nêu để đánh giá đúng cách này. Nếu mỗi chuỗi chỉ giữ một hoặc một vài khóa tại một thời điểm và xác suất mà bất kỳ hai hoặc nhiều chuỗi sẽ muốn cùng một khóa cùng một lúc là thấp (hoặc một truy cập ngẫu nhiên hoặc 8 người chạy trên các vị trí khác nhau trên một đường tròn chạy ở tốc độ tương tự hoặc những thứ phức tạp hơn) thì bạn sẽ tránh trường hợp xấu nhất khi một sợi chỉ phải ngủ để có khóa (hoặc trong một số trường hợp phải có hệ điều hành để quyết định ai thắng) bởi vì bạn có vài chủ đề và rất nhiều khóa.

Nếu mỗi chuỗi có thể muốn hàng trăm hoặc hàng ngàn khóa bất kỳ lúc nào thì mọi thứ sẽ bắt đầu thay đổi.

Tôi sẽ không chạm vào tình trạng bế tắc vì không biết gì về thùng chứa mà bạn đang sử dụng, nhưng bạn cần phải biết cần phải tránh chúng.

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