Ai đó có thể vui lòng giải thích đơn giản là tranh chấp chủ đề là gì?
Tôi đã googled nó, nhưng dường như không thể tìm thấy một lời giải thích đơn giản.
Ai đó có thể vui lòng giải thích đơn giản là tranh chấp chủ đề là gì?
Tôi đã googled nó, nhưng dường như không thể tìm thấy một lời giải thích đơn giản.
Câu trả lời:
Về cơ bản tranh chấp luồng là một điều kiện trong đó một luồng đang chờ khóa / đối tượng hiện đang được giữ bởi luồng khác. Do đó, luồng chờ này không thể sử dụng đối tượng đó cho đến khi luồng khác đã mở khóa đối tượng cụ thể đó.
Một số câu trả lời dường như tập trung vào sự tranh chấp khóa, nhưng khóa không phải là tài nguyên duy nhất mà sự tranh chấp có thể được trải nghiệm. Sự tham gia chỉ đơn giản là khi hai luồng cố gắng truy cập cùng một tài nguyên hoặc các tài nguyên liên quan theo cách sao cho ít nhất một trong các luồng tranh chấp chạy chậm hơn so với khi các luồng khác không chạy.
Ví dụ rõ ràng nhất về sự ganh đua là trên một khóa. Nếu luồng A có khóa và luồng B muốn có cùng khóa đó, luồng B sẽ phải đợi cho đến khi luồng A giải phóng khóa.
Bây giờ, đây là nền tảng cụ thể, nhưng luồng có thể gặp sự cố chậm lại ngay cả khi nó không bao giờ phải đợi luồng khác phát hành khóa! Điều này là do khóa bảo vệ một số loại dữ liệu và bản thân dữ liệu cũng sẽ thường xuyên bị tranh chấp.
Ví dụ, hãy xem xét một chủ đề có được một khóa, sửa đổi một đối tượng, sau đó phát hành khóa và thực hiện một số điều khác. Nếu hai luồng đang làm điều này, ngay cả khi chúng không bao giờ chiến đấu để khóa, các luồng có thể chạy chậm hơn nhiều so với khi chỉ có một luồng đang chạy.
Tại sao? Giả sử mỗi luồng đang chạy trên lõi của chính nó trên CPU x86 hiện đại và các lõi không chia sẻ bộ đệm L2. Chỉ với một luồng, đối tượng có thể vẫn ở trong bộ đệm L2 hầu hết thời gian. Với cả hai luồng đang chạy, mỗi lần một luồng sửa đổi đối tượng, luồng khác sẽ tìm thấy dữ liệu không có trong bộ đệm L2 của nó vì CPU kia làm mất hiệu lực dòng bộ đệm. Ví dụ, trên Pentium D, điều này sẽ khiến mã chạy ở tốc độ FSB, ít hơn nhiều so với tốc độ bộ đệm L2.
Vì sự tranh chấp có thể xảy ra ngay cả khi bản thân khóa không được tranh cãi, sự tranh chấp cũng có thể xảy ra khi không có khóa. Ví dụ: giả sử CPU của bạn hỗ trợ tăng nguyên tử của biến 32 bit. Nếu một luồng tiếp tục tăng và giảm một biến, thì biến đó sẽ nóng trong bộ đệm trong phần lớn thời gian. Nếu hai luồng làm điều đó, bộ nhớ cache của chúng sẽ tranh giành quyền sở hữu bộ nhớ giữ biến đó và nhiều truy cập sẽ chậm hơn vì giao thức kết hợp bộ đệm hoạt động để bảo đảm quyền sở hữu lõi của dòng bộ đệm.
Trớ trêu thay, khóa thường làm giảm sự tranh chấp. Tại sao? Bởi vì không có khóa, hai luồng có thể hoạt động trên cùng một đối tượng hoặc bộ sưu tập và gây ra nhiều tranh cãi (ví dụ: có hàng đợi khóa miễn phí). Khóa sẽ có xu hướng giảm dần các luồng tranh chấp, cho phép các luồng không tranh chấp chạy thay thế. Nếu luồng A giữ khóa và luồng B muốn cùng khóa đó, việc triển khai có thể chạy luồng C thay thế. Nếu luồng C không cần khóa đó, thì có thể tránh được sự tranh chấp trong tương lai giữa các luồng A và B trong một thời gian. (Tất nhiên, điều này giả định rằng có các luồng khác có thể chạy. Sẽ không hữu ích nếu cách duy nhất toàn bộ hệ thống có thể tạo ra tiến bộ hữu ích là bằng cách chạy các luồng tranh luận.)
Từ đây :
Một sự tranh chấp xảy ra khi một luồng đang chờ một tài nguyên không có sẵn; nó làm chậm việc thực thi mã của bạn, nhưng có thể xóa dần theo thời gian.
Sự bế tắc xảy ra khi một luồng đang chờ một tài nguyên mà một luồng thứ hai đã bị khóa và luồng thứ hai đang chờ một tài nguyên mà luồng đầu tiên đã bị khóa. Nhiều hơn hai chủ đề có thể được tham gia vào một bế tắc. Một bế tắc không bao giờ tự giải quyết. Nó thường làm cho toàn bộ ứng dụng, hoặc phần đang gặp bế tắc, bị dừng lại.
Tôi nghĩ cần có một số giải thích rõ ràng từ OP trên nền tảng của câu hỏi - tôi có thể nghĩ ra 2 câu trả lời (mặc dù tôi chắc chắn có những bổ sung cho danh sách này):
nếu bạn đang đề cập đến "khái niệm" chung về tranh chấp luồng và cách nó có thể tự trình bày trong một ứng dụng, tôi sẽ nói đến câu trả lời chi tiết của @ DavidSchwartz ở trên.
Ngoài ra còn có '.NET CLR Khóa và Chủ đề: Tổng số lượt truy cập hiệu suất của Contentions'. Như được lấy từ mô tả PerfMon cho bộ đếm này, nó được định nghĩa là:
Bộ đếm này hiển thị tổng số lần các luồng trong CLR đã cố gắng thu được khóa được quản lý không thành công. Khóa được quản lý có thể có được bằng nhiều cách; bằng câu lệnh "khóa" trong C # hoặc bằng cách gọi System.Monitor.Nhập hoặc bằng cách sử dụng thuộc tính tùy chỉnh Phương thức đồng bộ hóa.
... Và tôi chắc chắn những người khác cho các hệ điều hành và khung ứng dụng khác.
Một từ khác có thể là đồng thời. Nó chỉ đơn giản là ý tưởng của hai hoặc nhiều luồng cố gắng sử dụng cùng một tài nguyên.
Đối với tôi sự tranh chấp là một cuộc cạnh tranh giữa 2 hoặc nhiều luồng trên một tài nguyên được chia sẻ. Tài nguyên có thể là một khóa, một bộ đếm, vv Cạnh tranh có nghĩa là "ai lấy nó trước". Càng nhiều chủ đề càng ganh đua. Càng truy cập thường xuyên vào một tài nguyên, sự tranh chấp càng nhiều.
Hãy tưởng tượng kịch bản sau đây. Bạn đang chuẩn bị cho bài kiểm tra cuối cùng vào ngày mai và cảm thấy hơi đói. Vì vậy, bạn đưa cho em trai của mình mười đô la và yêu cầu anh ấy mua một chiếc bánh pizza cho bạn. Trong trường hợp này, bạn là chủ đề chính và anh trai của bạn là một chủ đề con. Sau khi đặt hàng của bạn được đưa ra, cả bạn và anh trai của bạn đang làm công việc của họ đồng thời (ví dụ, nghiên cứu và mua một chiếc bánh pizza). Bây giờ, chúng tôi có hai trường hợp để xem xét. Đầu tiên, anh trai của bạn mang bánh pizza của bạn trở lại và chấm dứt trong khi bạn đang học. Trong trường hợp này, bạn có thể ngừng học tập và thưởng thức pizza. Thứ hai, bạn hoàn thành việc học sớm và ngủ (tức là công việc được giao hôm nay - học cho kỳ thi cuối cùng vào ngày mai - đã xong) trước khi pizza có sẵn. Tất nhiên, bạn không thể ngủ được; nếu không, bạn sẽ không có cơ hội ăn pizza.
Như trong ví dụ, hai trường hợp cho ý nghĩa của sự cạnh tranh.
Sự tranh chấp khóa diễn ra khi một luồng cố gắng thu được khóa vào một đối tượng đã được luồng khác * thu được. Cho đến khi đối tượng được giải phóng, luồng bị chặn (nói cách khác, nó ở trạng thái Chờ). Trong một số trường hợp, điều này có thể dẫn đến cái gọi là thực thi nối tiếp ảnh hưởng tiêu cực đến ứng dụng.