2011-12-27 26 views
5

là gì tốt hơn:
có mã vùng lớn trong bản Tuyên Bố khóa
hoặc
có ổ khóa nhỏ trong diện tích lớn ..
trao đổi trong mẫu này là không changable? .cách thích hợp để khóa vùng code is gì

lock (padLock) 
{ 
    foreach (string ex in exchanges) 
    { 
    sub.Add(x.ID, new Subscription(ch, queue.QueueName, true)); 
......... 
} 

hoặc

foreach (string ex in exchanges) 
{ 
    lock (padLock) 
    { 
    sub.Add(x.ID, new Subscription(ch, queue.QueueName, true)); 
    } 
..... 
+2

Nó hoàn toàn phụ thuộc vào những gì bạn đang khóa. – SLaks

+0

@SLaks, tôi nghĩ rằng tôi không hoàn toàn hiểu khi nào sử dụng khóa sau đó .. :( – 0x49D1

+1

Ví dụ của bạn chưa hoàn thành nên không có ý nghĩa trong phạm vi câu hỏi vì không có 'ex' cũng không' trao đổi' không được sử dụng trong vòng lặp, vì vậy khó đề nghị bạn một cái gì đó cụ thể – sll

Trả lời

1

Khóa rộng hơn - số ít bạn nhận được từ đa luồng, và ngược lại Vì vậy, việc sử dụng khóa hoàn toàn phụ thuộc vào logic. Khóa chỉ sự vật và những nơi mà thay đổi và phải chỉ chạy bởi một thread trong một thời gian

Nếu bạn khóa cho việc sử dụng bộ sưu tập sub - sử dụng khóa nhỏ hơn, nhưng nếu bạn chạy nhiều đồng thời foreach vòng song song

1

thực hành tốt sẽ được chỉ khóa mà khu vực mà bạn muốn được thực hiện bởi chỉ một thread tại một thời gian nhất định

Nếu khu vực đó là toàn bộ vòng lặp foreach sau đó cách tiếp cận đầu tiên là phạt tiền

nhưng nếu khu vực đó chỉ là một dòng như bạn đã chỉ ra thì cách tiếp cận thứ hai sau đó đi đến phương pháp thứ hai

1

Trong trường hợp cụ thể này, tùy chọn tốt nhất là tùy chọn đầu tiên, vì nếu không bạn chỉ lãng phí thời gian khóa/mở khóa vì bạn phải thực thi toàn bộ vòng lặp. Vì vậy, không có nhiều cơ hội cho song song trong một vòng lặp mà thực hiện các hoạt động nguyên tử riêng lẻ.

Để được tư vấn tổng quát hơn về kích thước phần quan trọng kiểm tra bài viết này: http://software.intel.com/en-us/articles/managing-lock-contention-large-and-small-critical-sections/

0

Bạn có thể không có hiệu quả đánh giá đó là "đúng" với các đoạn mã nhất định. Ví dụ đầu tiên nói rằng không phải là OK cho mọi người để xem phụ chỉ với một phần của nội dung từ trao đổi. Ví dụ thứ hai cho biết mọi người có thể xem phụ chỉ với một phần nội dung từ các trao đổi.

1

Tôi nghĩ có hai câu hỏi khác nhau:
1. Điều gì sẽ đúng?
2. Điều gì sẽ mang lại hiệu suất tốt hơn?

Câu hỏi đúng đắn là phức tạp. Nó phụ thuộc vào cấu trúc dữ liệu của bạn và cách bạn dự định khóa để bảo vệ chúng. Nếu đối tượng "phụ" không phải là chủ đề an toàn, bạn chắc chắn cần khóa lớn.

Câu hỏi hiệu suất đơn giản và ít quan trọng hơn (nhưng vì một lý do nào đó, tôi nghĩ bạn đang tập trung vào nó nhiều hơn).
Nhiều ổ khóa nhỏ có thể chậm hơn, vì chúng chỉ hoạt động nhiều hơn. Nhưng nếu bạn quản lý để chạy một phần lớn của mã vòng lặp mà không có khóa, bạn sẽ nhận được một số đồng thời, vì vậy nó sẽ tốt hơn.

+0

cảm ơn bạn đã giải thích tốt đẹp. Ive đặt các vòng với các bộ sưu tập không an toàn chủ đề vào ổ khóa như ive thực hiện với một số đoạn mã có chứa sửa đổi bộ sưu tập. Cái xấu trong khóa lớn cho tôi ở đây là khối cũng chứa một số phương thức từ cùng một lớp và sử dụng cùng một đối tượng đồng bộ. Vì vậy, tôi nghĩ rằng, đôi khi dẫn đến deadlocks (hoặc chỉ không cần thiết ổ khóa) trong chương trình đang chạy :(Sau khi tất cả các chương trình sửa đổi là phản ứng nhanh hơn bây giờ. – 0x49D1

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