Race Condition Là Gì

     

Hai sự việc data race với race condition xuất xắc bị tiến công đồng là 1 (có lẽ vì cùng trường đoản cú race). Tuy nhiên nó diễn đạ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 có bài giờ đồng hồ Việt nào phân minh về hai định nghĩa này và coi chúng tương đồng khi Google search, thậm chí còn không đề cập mang đến data race. Do đó, học xuất sắc ngoại ngữ và đặc biệt là tiếng Anh sẽ giúp đỡ ích rất nhiều cho tuyến đường hiện tại và về sau 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 với và chọn lựa sự đúng đắn cho bản thân. Cũng đừng vội tin các gì mình share mà hãy từ bỏ 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 sót lại là race condition với xem chúng khác biệt như nuốm nào. Let"s begin.

Race condition

Quay lại khái niệm data race, nó xẩy ra khi:

Từ 2 thread/process trở lên cùng truy vấn vào vùng nhớ tầm thường (shared resource).Ít tuyệ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 gỡ phải hoàn toàn có thể là:

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

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

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

Vấn đề không đúng sót về mặt thời gian hoặc trang bị tự thực thi của các thread vào chương trình khiến cho tác dụng cuối cùng không đúng như muốn muốn.

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

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

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

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

Câu chuyện dường như í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ỉ với một hộp N95 duy nhất. Đíp note luôn vào cuốn sổ đi chợ nhằm đi tải không lại quên.

ĐípHớp đóng vai 2 thread, danh sách mua đồ gia dụng là shared resource, đã tất cả sẵn 1 hộp khẩu trang rồi. Cây bút đại diện cho mutex.

Đíp nghĩ tải thêm 3 vỏ hộp là đủ, Đíp rước cây bú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 tải sắm, Hớp cần mua gấp 3 bắt đầu thích. Sau thời điểm Đíp viết xong, Hớp đem cây cây viết và sửa tự 4 thành 12. Chốt deal, download 12 vỏ hộp khẩu trang. Hoàn toàn không xẩy ra data race, độc nhất 1 thread phát âm ghi tại một thời điểm.

Xem thêm: Người Sảy Thai Nên Ăn Gì, Kiêng Gì? Thực Đơn Tốt Nhất Sảy Thai Nên Ăn Gì Tốt Cho Sức Khỏe

Hình như chưa tồn tại vấn đề gì, hãy để ý khi ta đổi ngược sản phẩm công nghệ tự thực hiện. Hớp mình mang cây bút trước, sửa từ là 1 thành 3 (1 * 3). Tiếp nối đến lượt Đíp và sửa từ 3 thành 6 (3 + 3). Chốt deal, cài 6 hộp khẩu trang.

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

Chờ chút, tại sao không điều hành và kiểm soát được số lần xúc tiến của thread? bài xích trước mình bao gồm đề cập đến Thread starvation. Trường hợp trong cả gấp đôi thực thi trên, mình ko được tiến hành lần nào, công dụng sẽ là 1 trong những * 3 * 3 = 9 hộp khẩu trang. Kết quả không giống gấp đôi trước.

Data race với race condition là hai sự việc khác nhau! tất cả race condition nhưng không có data race.

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

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

Ví dụ cùng với code mang lại 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 cùng in ra 1000 chiếc với mỗi thread. Không thực hiện shared resource làm sao nên chắc chắn không bao gồm data race. Tuy vậy mỗi lần chạy đang ra tác dụng khác nhau. Đó là race condition.

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

Thời sinh viên tôi đã từng gặp mặt case giả dụ thêm System.out.println() thì chương trình chạy đúng kết quả, nhưng loại bỏ đi thì chạy không đúng (smell vãi ).

Với Java, gồm một vài phương pháp để kiểm rà soát được thứ tự thực hiện của thread. Lưu lại ý, chỉ đảm bảo an toàn thứ tự tiến hành trước sau của thread chứ không chắc chắn là 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 cụ thể ngăn ngăn race condition.

Reference

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

After credit

Với single thread, có chức năng xảy ra data race không?

Bản chất của data race là gọi sai quý hiếm 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ó chức năng xảy ra data race.

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

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

Xem thêm: Cách Cài Đặt Giao Diện Mac Os Cho Win 8, Cách Biến Windows Thành Macos Big Sur

NOTE: tranh thủ kiếm tìm talent về với team mình. Nếu như bạn đang lưu ý đến một cơ hội mới cùng với 2 mục tiêu:

Job remote full time, ko quản thúc thời hạn hay địa điểm. Bạn hoàn toàn có thể vừa nhâm nhi li cocktail bên bãi biễn, vừa fix bug và chuyện trò với crush.Package sản phẩm năm lên đến 50k USD (chưa tính thưởng + bonus), tất yếu nó còn tùy trực thuộc vào sự chai lì của bạn.

Đừng xấu hổ ngần liên hệ với bản thân nếu mong muốn nhé. Mà thời buổi này ngại chỉ tất cả thiệt thân thôi, good luck!