Race condition là gì

  -  

Hai vấn đề data race cùng race condition xuất xắc bị tấn công đồng là 1 trong (có lẽ vì cùng tự race). Tuy nhiên nó miêu tả hai vấn đề không giống nhau trong lập trình multi-thread.

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

Gần như không tồn tại bài tiếng Việt nào rành mạch về hai định nghĩa này và coi chúng hệt nhau khi Google search, thậm chí còn không đề cập mang đến data race. Bởi đó, học giỏi ngoại ngữ và nhất là tiếng Anh để giúp đỡ ích không hề ít cho con đường hiện trên và sau này của chúng ta.

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

*

Hơi lan man, bài bác trước bọn họ đã nắm vững về data race, lúc này sẽ khám phá về khái niệm còn lại là race condition với xem chúng khác nhau như nắm 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 trên cùng truy vấn vào vùng nhớ chung (shared resource).Ít tốt nhất 1 thread/process biến hóa giá trị của vùng nhớ tầm thường đó.

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

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

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

Tuy nhiên, với biện pháp làm trên chỉ đảm bảo không có data race, nhưng không ngăn chặn được race condition. Vắt thể, race condition nói về:

Vấn đề không nên sót về mặt thời gian hoặc thứ tự thực thi của các thread trong chương trình khiến cho cho công dụng cuối thuộc không đúng như mong muốn muốn.

Trong thực tế, race condition xẩy ra do data race với data race dẫn đến race condition. Không khác biệt lắm thất thoát , tuy vậy hai vấn đề này không phụ thuộc vào nhau.

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

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

Quay quay trở về vài năm ngoái khi Jônny Đíp cùng Ambờ Hớp vẫn mặn nồng thắm thiết mặt nhau. Mỗi khi đi ra ngoài đường là cánh paparazi lại săn đuổi đến chạy tụt cả quần. Chính vì như vậy nên cả 2 ra quyết định đeo bịt kín mặt khi ra đường, vừa để bịt giấu thân phận cũng vừa để bảo vệ bản thân khỏi nhỏ Corona vẫn hoành hành.

Câu chuyện có vẻ íu liên quan lắm nhỉ. Vào vấn đề chính đi ông ơi.

Ok, Đíp chợt nhận thấy trong nhà chỉ còn một vỏ hộp N95 duy nhất. Đíp note luôn vào cuốn sổ đi chợ nhằm đi thiết lập không lại quên.

Đíp với Hớp đóng vai 2 thread, danh sách mua trang bị là shared resource, đã gồm sẵn một hộp khẩu trang rồi. Cây bút thay mặt cho mutex.

Xem thêm: Cách Chơi Game Hoa Hau Hoan Vũ Thế Giới 2021, Game Hoa Hậu Hoàn Vũ

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

Hình như chưa xuất hiện vấn đề gì, hãy để ý khi ta thay đổi ngược sản phẩm tự thực hiện. Hớp mình rước cây bút trước, sửa từ một thành 3 (1 * 3). Kế tiếp đến lượt Đíp và sửa trường đoản cú 3 thành 6 (3 + 3). Chốt deal, sở hữu 6 vỏ hộp khẩu trang.

Mặc dù đã thực hiện cây cây viết là mutex triển khai việc truy cập đến danh sách bán buôn là shared resource bảo vệ không xảy ra data race. Mặc dù nhiên kết quả cuối cùng với mỗi cách thực hiện lại khác 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, vì sao không kiểm soát và điều hành được số lần triển khai của thread? bài xích trước mình bao gồm đề cập đến Thread starvation. Ví như trong cả 2 lần thực thi trên, mình không được thực hiện lần nào, tác dụng sẽ là 1 * 3 * 3 = 9 hộp khẩu trang. Hiệu quả không giống 2 lần trước.

Data racerace condition là hai vấn đề 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à vấn đề rút tiền sống ATM (bài trước).

Trong thực tế, rất khó để phát hiện ra race condition vì sự việc liên quan cho thứ tự thực hiện các thread, và tất nhiên OS sẽ làm điều đó.

Ví dụ cùng 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 với secondThread chạy đồng thời cùng in ra 1000 cái với từng thread. Không thực hiện shared resource nào nên chắc hẳn rằng không có data race. Mặc dù mỗi lần chạy đang ra tác dụng khác nhau. Đó là race condition.

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

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

Với Java, gồm một vài cách để kiểm thẩm tra được sản phẩm tự thực hiện của thread. Giữ ý, chỉ bảo đảm an toàn thứ tự triển khai trước sau của thread chứ không chắc hẳn rằng thread được thực thi khi nào. Từ bỏ đó xử lý được vụ việc race condition.

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

Reference

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

After credit

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

Bản hóa học của data race là gọi sai giá trị trong shared resource. Trong một chương trình, nếu 2 thread thuộc đọc/ghi vào shared resource (không áp dụng mutex) sẽ có công dụng xảy ra data race.

Vậy cùng với single thread làm cho sao có thể xảy ra data race được? chủ công là nếu 2 công tác single thread chạy bên cạnh đó với nhau, cùng thực hiện đọc/ghi với shared resource lấy một ví dụ như: file, database... Thì trả toàn có công dụng xảy ra data race.

Xem thêm: ‘ Avengers: Hồi Kết Nhân Vật Bất Hủ Trong Avengers Đã Thay Đổi Ra Sao? (P3)

Như vậy data race có tác dụng xảy ra với single thread. Đi phỏng vấn mà được đặt ra những câu hỏi như vậy, cứ dạn dĩ dạn vấn đáp như trên nhé .