RACE CONDITION LÀ GÌ

     

Hai vấn đề data race cùng race condition xuất xắc bị đánh đồng là một trong (có lẽ bởi cùng trường đoản cú race). Mặc dù nó mô tả hai vấn đề không giống nhau trong lập trình sẵn multi-thread.

Bạn đang xem: Race condition là gì

Gần như không tồn tại bài giờ Việt nào phân minh về hai có mang này với coi chúng như nhau khi Google search, thậm chí là không đề cập cho data race. Vì đó, học xuất sắc ngoại ngữ và đặc biệt là tiếng Anh sẽ giúp ích tương đối nhiều cho con phố hiện tại và trong tương lai của chúng ta.

Lưu ý, không hẳn nguồn nào cũng chính thống và nội dung bài viết nào cũng đúng. Trọng trách của bọn họ là đọc, so sánh và chọn lọc sự chính xác cho bạn dạng thân. Cũng đừng vội tin phần đông gì mình chia sẻ mà hãy trường đoản cú kiểm chứng.

*

Hơi lan man, bài xích trước chúng ta đã nắm rõ về data race, bây giờ sẽ tìm hiểu về khái niệm còn lại là race condition và xem chúng không giống nhau như vắt nào. Let"s begin.

Race condition

Quay lại có mang data race, nó xảy ra khi:

Từ 2 thread/process trở lên cùng truy vấn vào vùng nhớ phổ biến (shared resource).Ít tuyệt nhất 1 thread/process đổi khác giá trị của vùng nhớ bình thường đó.

Do đó, vấn đề gặp gỡ phải có thể là:

Các quý hiếm ghi đè lẫn nhau.Đọc ra sai giá trị.

Việc xử trí data race ko phức tạp, chỉ cần bảo vệ một thread được truy cập vào critical section tại 1 thời điểm, áp dụng cơ chế mutual exclusion.

Tuy nhiên, với cách làm trên chỉ đảm bảo không gồm data race, cơ mà không ngăn chặn được race condition. Cầm thể, race condition nói về:

Vấn đề sai sót về mặt thời gian hoặc lắp thêm tự thực thi của các thread trong chương trình khiến cho cho hiệu quả cuối cùng không đúng như ước ao muốn.

Trong thực tế, race condition xảy ra do data race với data race dẫn mang lại race condition. Không khác biệt lắm thất thoát , tuy nhiên hai sự việc này không nhờ vào vào nhau.

Một chương trình hoàn toàn có thể có data race mà không tồn tại race condition.Hoặc bao gồm race condition mà không có data race.

Loằng ngoằng thật, lao vào ví dụ cho dễ hình dung.

Thời buổi Covid, phải luôn đeo khẩu trang để bảo vệ phiên bản thân và những người dân xung xung quanh nhé. Oh, bản thân chợt nhận thấy trong kho chỉ từ một hộp. Mình sẵn sàng đi chợ, đã lên danh sách mua đồ, tiện thể thể tải thêm vài vỏ hộp khẩu trang.

Mình và vợ sẽ nhập vai 2 thread, list mua đồ dùng là shared resource, đã có sẵn một hộp khẩu trang rồi. Cây bút đại diện thay mặt cho mutex.

Mình nghĩ tải thêm 3 vỏ hộp là đủ, mình lấy cây viết (đảm bảo không xảy ra data race), sửa lại từ là một thành 4. đàn bà tính thích sở hữu sắm, bà xã mình yêu cầu mua vội vàng 3 mới thích. Sau khi mình viết xong, cô ấy lấy cây cây bút và sửa tự 4 thành 12. Chốt deal, sở hữu 12 vỏ hộp khẩu trang. Trọn vẹn không xẩy ra data race, tuyệt nhất 1 thread đọc ghi tại 1 thời điểm.

Xem thêm: Apple Khai Tử Iphone 11 Pro Max Còn Sản Xuất Không? Lý Do Bị Khai Tử?

Hình như chưa có vấn đề gì, hãy lưu ý khi ta đổi ngược máy tự thực hiện. Vk mình lấy cây bút trước, sửa từ một thành 3 (1 * 3). Kế tiếp đến lượt mình và sửa từ 3 thành 6 (3 + 3). Chốt deal, mua 6 vỏ hộp khẩu trang.

Mặc dù đã áp dụng cây cây bút là mutex thực hiện việc truy vấn đến danh sách sắm sửa là shared resource bảo đảm không xẩy ra data race. Tuy nhiên công dụng cuối cùng rất mỗi cách thực hiện lại không giống nhau vì ta không điều hành và kiểm soát được thứ tự cùng số lần thực thi của những thread. Đó đó là race condition.

Chờ chút, lý do không kiểm soát và điều hành được số lần triển khai của thread? bài trước mình tất cả đề cập đến Thread starvation. Ví như trong cả gấp đôi thực thi trên, mình ko được triển khai lần nào, kết quả sẽ là một * 3 * 3 = 9 hộp khẩu trang. Hiệu quả không giống gấp đôi trước.

Data racerace condition là hai vụ việc khác nhau! gồm race condition nhưng không có data race.

Ví dụ về data race mà không tồn tại race condition thì sao? Đơn giản thôi, là câu hỏi rút tiền sinh sống ATM (bài trước).

Trong thực tế, không dễ để phát chỉ ra race condition vì vấn đề liên quan đến thứ tự triển khai các thread, và tất yếu OS sẽ có tác dụng điều đó.

Ví dụ với code mang đến dễ hình dung:

public class RaceCondition public static void main(String<> args) throws InterruptedException var firstThread = new Thread(() -> IntStream.range(0, 1000) .forEach(i -> System.out.println("First thread " + i))); var secondThread = new Thread(() -> IntStream.range(0, 1000) .forEach(i -> System.out.println("Second thread" + i))); firstThread.start(); secondThread.start(); firstThread.join(); secondThread.join(); Hai thread firstThread cùng secondThread chạy đồng thời và in ra 1000 loại với mỗi thread. Không sử dụng shared resource nào nên chắc chắn là không tất cả data race. Tuy vậy mỗi lần chạy vẫn ra tác dụng khác nhau. Đó là race condition.

Bạn có thể chạy đúng hàng trăm ngàn lần, test hàng trăm ngàn lần và không tồn tại vấn đề gì xảy ra. Dẫu vậy một ngày rất đẹp trời, nó xảy ra và có tác dụng sai lệch hiệu quả chương trình. Phần đông bug tiềm tàng đó được gọi với cái tên Heisenbug (có bạn nào là fan của Breaking Bad ko nhỉ).

Thời sinh viên mình đã từng chạm mặt case nếu như thêm System.out.println() thì lịch trình chạy đúng kết quả, nhưng loại bỏ thì chạy sai (smell vãi ).

Với Java, bao gồm một vài cách để kiểm thẩm tra được máy tự triển khai của thread. Lưu giữ ý, chỉ đảm bảo an toàn thứ tự thực hiện trước sau của thread chứ không chắc chắn rằng thread được thực thi khi nào. Tự đó giải quyết được vụ việc race condition.

Bài sau mình đang trình bày chi tiết ngăn chặn race condition.

Reference

Reference in series: https://techftc.com/s/multithread-programming-tu-hardware-toi-software-voi-java-QqKLvp2rl7z

After credit

Với single thread, có tác dụng xảy ra data race không?

Bản hóa học của data race là hiểu sai cực hiếm trong shared resource. Vào một chương trình, trường hợp 2 thread cùng đọc/ghi vào shared resource (không áp dụng mutex) sẽ có khả năng xảy ra data race.

Vậy cùng với single thread có tác dụng sao có thể xảy ra data race được? cốt tử là trường hợp 2 lịch trình single thread chạy bên cạnh đó với nhau, cùng triển khai đọc/ghi và shared resource ví dụ như: file, database... Thì trả toàn có khả năng xảy ra data race.

Xem thêm: # 1 Gói Ngũ Cốc Bao Nhiêu Calo ? Ngũ Cốc Dinh Dưỡng B’Fast Có Béo Không?

Như vậy data race có khả năng xảy ra với single thread. Đi phỏng vấn mà được hỏi như vậy, cứ mạnh bạo dạn trả lời như trên nhé .