Sự tranh chấp chủ đề là gì?


119

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.


9
Vì vậy, hãy viết ra những suy nghĩ mơ hồ của bạn về nó, để chúng tôi có thể thấy bạn có thể ở đâu, hoặc sự hiểu biết của bạn có thể đúng.
James Black

Câu trả lời:


87

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ể đó.


53
Câu trả lời này là không đầy đủ (như hầu hết những người khác). Mặc dù khóa là một loại thứ có thể gây tranh cãi, nhưng nó khác xa với thứ duy nhất như vậy. Có thể có sự tranh chấp cho các tài nguyên không khóa là tốt. (Ví dụ: nếu hai luồng tiếp tục tăng nguyên tử cùng một số nguyên, chúng có thể gặp phải sự tranh chấp do ping-ponging bộ đệm. Không có khóa nào được tham gia.)
David Schwartz

Trong trường hợp Khóa phiên dịch toàn cầu (GIL) như trong CPython, trong đó một luồng phải luôn có được GIL, do đó, nhiều luồng chạy trong cùng một quy trình do đó được tranh chấp theo mặc định.
Acumenus

Tôi nghĩ rằng bạn đã giải thích nó về Deadlock nhưng nó rất khác với Deadlock.
Harshit Gupta

184

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


4
+1 Ngoài ra, để làm rõ điều này, hai biến mà hai lõi đang chiến đấu thậm chí không cần phải là cùng một biến để gây tranh chấp, chúng chỉ phải được lưu trữ trong bộ nhớ trong cùng một dòng bộ đệm. Cấu trúc đệm và / hoặc sắp xếp cấu trúc vào bộ nhớ có thể giúp tránh hình thức tranh chấp này.
Rob_b Before_edits

1
@David vui lòng giúp hiểu chi tiết câu trả lời cuối cùng của bạn một cách chi tiết hơn
Người học

4
@Naroji Đặt câu hỏi về nó.
David Schwartz

@DavidSchwartz, Bạn có phải là lập trình viên C không?
Pacerier

@Pacerier C ++ là chủ yếu.
David Schwartz

19

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.


Điều này cũng giải thích sự khác biệt giữa Sự tham gia của chủ đề và Bế tắc
Sankalp

3

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

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

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


2

Bạn có 2 chủ đề. Chủ đề A và chủ đề B, bạn cũng có đối tượng C.

A hiện đang truy cập đối tượng C và đã đặt khóa trên đối tượng đó. B cần truy cập vào đối tượng C, nhưng không thể làm như vậy cho đến khi A giải phóng khóa trên đối tượng C.


1

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.


1

Đố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.


1

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.


0

Sự tranh chấp chủ đề cũng bị ảnh hưởng bởi các hoạt động I / O. Ví dụ khi một Chủ đề đang chờ tệp đọc, nó có thể coi là một sự tranh chấp. Sử dụng cổng hoàn thành I / O làm giải pháp.


0

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.

từ tài liệu dotTrace

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.