Race Condition Là Gì

     

Hai vấn đề data race cùng race condition tuyệt bị tiến công đồng là 1 (có lẽ do cùng trường đoản cú race). Tuy vậy nó miêu tả hai vấn đề khác biệt 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ờ đồng hồ Việt nào riêng biệt về hai có mang này với coi chúng giống hệt khi Google search, thậm chí là không đề cập đến data race. Vị đó, học tốt ngoại ngữ và nhất là tiếng Anh để giúp đỡ ích không ít cho tuyến phố hiện tại và sau đây của chúng ta.

Lưu ý, không hẳn nguồn nào thì cũng chính thống và bài viết nào cũng đúng. Trách nhiệm của bọn họ là đọc, đối chiếu và sàng lọc sự đúng mực cho phiên bản thân. Cũng chớ vội tin rất nhiều gì mình chia sẻ mà hãy từ bỏ kiểm chứng.

*

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

Race condition

Quay lại định nghĩa data race, nó xảy ra khi:

Từ 2 thread/process trở lên cùng truy cập vào vùng nhớ thông thường (shared resource).Ít độc nhất vô nhị 1 thread/process biến hóa giá trị của vùng nhớ thông thường đó.

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

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

Việc cách xử trí data race không phức tạp, chỉ cần bảo đảm an toàn một thread được truy vấn vào critical section tại một thời điểm, thực hiện 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, mà lại không ngăn ngừa được race condition. Thay 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 những thread vào chương trình khiến cho cho hiệu quả cuối thuộc không đúng như muốn 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 nhau lắm rò rỉ , tuy vậy hai vấn đề 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 có race condition.Hoặc gồm 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 trước khi Jônny ĐípAmbờ Hớp vẫn mặn nồng thắm thiết bên nhau. Từng khi ra đường là cánh paparazi lại săn đuổi mang đến chạy tụt cả quần. Vì vậy nên cả 2 ra quyết định đeo trùm kín mặt khi ra đường, vừa để bít 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 có vẻ như íu tương quan lắm nhỉ. Vào việc 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 luôn vào cuốn sổ đi chợ để đi mua không lại quên.

ĐípHớp vào vai 2 thread, list mua vật dụng là shared resource, đã có sẵn một hộp khẩu trang rồi. Cây bút đại diện cho mutex.

Đíp nghĩ mua 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 cài đặt sắm, Hớp đề nghị mua cấp 3 new thích. Sau khoản thời gian Đíp viết xong, Hớp mang cây cây viết và sửa trường đoản cú 4 thành 12. Chốt deal, thiết lập 12 hộp khẩu trang. Trọn vẹn không xẩy ra data race, duy nhất 1 thread đọc ghi tại 1 thời điểm.

Xem thêm: Apartment Building Là Gì ? Apartment Complex Là Gì? Apartment Building Là Gì?

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

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

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

Data race cùng race condition là hai vụ việc khác nhau! gồm race condition nhưng không tồn tại data race.

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

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

Ví dụ với code cho 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 firstThreadsecondThread chạy đồng thời cùng in ra 1000 dòng với mỗi thread. Không sử dụng shared resource như thế nào nên chắc chắn rằng không gồm data race. Tuy nhiên mỗi lần chạy đã ra kết quả 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 trăm lần và không tồn tại vấn đề gì xảy ra. Nhưng mà một ngày đẹp trời, nó xẩy ra và làm sai lệch kết quả chương trình. Hồ hết bug tiềm tàng này được gọi với cái tên Heisenbug (có các bạn nào là fan hâm mộ của Breaking Bad ko nhỉ).

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

Với Java, bao gồm một vài cách để kiểm rà soát được đồ vật tự tiến hành của thread. Lưu lại ý, chỉ bảo đảm an toàn thứ tự thực thi trước sau của thread chứ không chắc hẳn rằng thread được thực hiện khi nào. Trường đoản cú đó xử lý được vụ việc race condition.

Bài sau mình đang trình bày cụ thể ngăn ngăn race condition.

Reference

Reference in series: https://namlinhchihoasen.com/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 hóa học của data race là hiểu sai giá trị trong shared resource. Trong một chương trình, giả dụ 2 thread cùng đọc/ghi vào shared resource (không sử dụng mutex) sẽ có khả năng xảy ra data race.

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

Như vậy data race có công dụng xảy ra cùng với single thread. Đi chất vấn mà được đặt câu hỏi như vậy, cứ mạnh khỏe dạn trả lời như bên trên nhé .

Xem thêm: Đăng Ký Làm Đại Lý Thu Hộ Tiền Điện Cần Thủ Tục Gì? Đăng Ký Làm Đại Lý Thu Hộ Tiền Điện

NOTE: tranh thủ tìm kiếm talent về với team mình. Nếu khách hàng đang cân nhắc một cơ hội mới với 2 mục tiêu:

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

Đừng không tự tin ngần tương tác với bản thân nếu mong muốn nhé. Mà ngày nay ngại chỉ gồm thiệt thân thôi, good luck!