Race Condition Là Gì

Hai vấn đề data race cùng race condition giỏi bị đánh đồng là 1 (có lẽ rằng bởi thuộc từ bỏ race). Tuy nhiên nó diễn tả nhị vụ việc không giống nhau vào lập trình multi-thread.

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

Gần như không có bài xích giờ đồng hồ Việt làm sao rành mạch về nhị quan niệm này và coi bọn chúng đồng nhất Lúc Google tìm kiếm, thậm chí còn ko đề cùa tới data race. Do đó, học tập tốt ngoại ngữ cùng đặc biệt là giờ Anh sẽ giúp ích không ít mang đến con phố hiện nay với sau đây của họ.

Lưu ý, không hẳn mối cung cấp nào thì cũng thiết yếu thống cùng nội dung bài viết nào thì cũng đúng. Nhiệm vụ của bọn họ là phát âm, so với và tuyển lựa sự đúng đắn cho bạn dạng thân. Cũng đừng gấp tin đều gì mình chia sẻ mà lại hãy trường đoản cú kiểm chứng.

*

Hơi lan man, bài xích trước họ đang nắm vững về data race, lúc này vẫn mày mò về tư tưởng còn lại là race condition cùng coi chúng khác biệt thế nào. Let"s begin.

Race condition

Quay lại tư tưởng data race, nó xẩy ra khi:

Từ 2 thread/process trlàm việc lên thuộc truy cập vào vùng lưu giữ phổ biến (shared resource).Ít nhất 1 thread/process đổi khác giá trị của vùng lưu giữ phổ biến đó.

Do kia, vụ việc chạm mặt đề nghị rất có thể là:

Các cực hiếm ghi đè cổ cho nhau.Đọc ra không đúng giá trị.

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

Tuy nhiên, với phương pháp làm cho trên chỉ bảo đảm không có data race, nhưng lại ko ngăn ngừa được race condition. Cụ thể, race condition nói về:

Vấn đề không nên sót về khía cạnh thời gian hoặc sản phẩm công nghệ tự xúc tiến của những thread trong chương trình để cho hiệu quả sau cuối không ổn suôn sẻ.

Trong thực tế, race condition xẩy ra bởi vì data racedata race dẫn mang lại race condition. Không không giống nhau lắm nhỉ , tuy nhiên nhị vụ việc này sẽ không nhờ vào vào với nhau.

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

Loằng ngoằng thật, nhảy vào ví dụ đến dễ dàng tưởng tượng.

Thời buổi Covid, đề nghị luôn luôn treo khẩu trang y tế nhằm đảm bảo an toàn phiên bản thân với những người dân bao bọc nhé. Oh, mình chợt nhận thấy trong kho chỉ với một vỏ hộp. Mình chuẩn bị đi chợ, vẫn lên danh sách cài đồ vật, nhân tiện thể thiết lập thêm vài ba vỏ hộp khẩu trang chống bụi.

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

Mình nghĩ về download thêm 3 hộp là đầy đủ, mình rước bút (bảo vệ không xẩy ra data race), sửa lại từ là 1 thành 4. Con gái tính mê thích bán buôn, bà xã bản thân nên cài vội 3 mới thích. Sau khi bản thân viết xong xuôi, cô ấy rước cây cây bút cùng sửa từ bỏ 4 thành 12. Chốt giảm giá khuyến mãi, download 12 vỏ hộp khẩu trang. Hoàn toàn không xẩy ra data race, độc nhất vô nhị 1 thread gọi ghi tại 1 thời điểm.

Xem thêm: Tùng Vàng Vertu Là Ai - Sao Việt Chúc Mừng Đại Gia

Dường như chưa xuất hiện vụ việc gì, hãy xem xét Lúc ta thay đổi ngược trang bị trường đoản cú triển khai. Vợ mình mang cây bút trước, sửa từ là một thành 3 (1 * 3). Sau đó đến lượt mình và sửa từ 3 thành 6 (3 + 3). Chốt khuyễn mãi giảm giá, thiết lập 6 vỏ hộp khẩu trang.

Mặc cho dù vẫn áp dụng cây cây bút là mutex tiến hành việc truy cập đến list bán buôn là shared resource bảo đảm ko xẩy ra data race. Tuy nhiên tác dụng ở đầu cuối với mỗi phương pháp triển khai lại khác biệt vày ta ko kiểm soát điều hành được đồ vật từ bỏ và số lần thực hiện của các thread. Đó đó là race condition.

Chờ chút ít, tại vì sao ko kiểm soát được số lần thực thi của thread? Bài trước mình tất cả đề cùa tới Thread starvation. Nếu trong cả gấp đôi tiến hành bên trên, bản thân ko đượ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ả rất khác 2 lần trước.

Data race cùng race condition là hai sự việc khác nhau! Có race condition dẫu vậy không tồn tại data race.

lấy ví dụ như về data race mà không tồn tại race condition thì sao? Đơn giản thôi, là bài toán rút ít chi phí ngơi nghỉ ATM (bài xích trước).

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

lấy 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 mặt khác cùng in ra 1000 mẫu với từng thread. Không sử dụng shared resource nào nên chắc chắn là không có data race. Tuy nhiên những 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 ngàn lần, demo hàng trăm ngàn lần với không có vụ việc gì xẩy ra. Nhưng một ngày đẹp nhất trời, nó xẩy ra cùng làm sai lệch tác dụng công tác. Những bug tiềm tàng này được Hotline cùng với cái tên Heisenbug (gồm bạn nào là bạn của Breaking Bad ko nhỉ).

Thời sinc viên mình đã từng có lần chạm chán case ví như thêm System.out.println() thì công tác chạy đúng hiệu quả, nhưng loại bỏ thì chạy không đúng (smell vãi ).

Với Java, tất cả một vài ba cách để kiểm soát điều hành được thiết bị tự triển khai của thread. Lưu ý, chỉ đảm bảo lắp thêm từ bỏ thực hiện trước sau của thread chứ không hề chắc chắn rằng thread được thực thi khi nào. Từ kia giải quyết và xử lý được sự việc race condition.

Bài sau bản thân đã trình diễn cụ thể ngăn chặn race condition.

Reference

Reference in series: https://bloginar.net/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 không nên cực hiếm vào shared resource. Trong một chương trình, giả dụ 2 thread thuộc đọc/ghi vào shared resource (ko thực hiện mutex) đang có chức năng xảy ra data race.

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

Vậy nên data race có tác dụng xẩy ra với single thread. Đi vấn đáp nhưng được đặt câu hỏi như vậy, cđọng bạo dạn vấn đáp như trên nhé .