Có một sự khác biệt kỹ thuật quan trọng giữa điều kiện cuộc đua và cuộc đua dữ liệu. Hầu hết các câu trả lời dường như đưa ra giả định rằng các thuật ngữ này là tương đương, nhưng chúng không phải là.
Cuộc đua dữ liệu xảy ra khi 2 hướng dẫn truy cập vào cùng một vị trí bộ nhớ, ít nhất một trong số các truy cập này là ghi và không có gì xảy ra trước khi đặt hàng trong số các truy cập này. Bây giờ những gì cấu thành một sự kiện xảy ra trước khi đặt hàng là đối tượng của rất nhiều cuộc tranh luận, nhưng nói chung, các cặp khóa-khóa trên cùng một biến khóa và các cặp tín hiệu chờ trên cùng một biến điều kiện tạo ra một lệnh xảy ra trước khi xảy ra.
Một điều kiện cuộc đua là một lỗi ngữ nghĩa. Đó là một lỗ hổng xảy ra trong thời gian hoặc thứ tự các sự kiện dẫn đến hành vi chương trình sai lầm .
Nhiều điều kiện chủng tộc có thể (và trên thực tế là) gây ra bởi các cuộc đua dữ liệu, nhưng điều này là không cần thiết. Trên thực tế, các cuộc đua dữ liệu và điều kiện chủng tộc không phải là điều cần thiết, cũng không phải là điều kiện đủ cho nhau. Bài đăng trên blog này cũng giải thích sự khác biệt rất tốt, với một ví dụ giao dịch ngân hàng đơn giản. Dưới đây là một ví dụ đơn giản giải thích sự khác biệt.
Bây giờ chúng tôi đóng đinh các thuật ngữ, chúng ta hãy cố gắng trả lời câu hỏi ban đầu.
Cho rằng điều kiện chủng tộc là lỗi ngữ nghĩa, không có cách nào chung để phát hiện ra chúng. Điều này là do không có cách nào có một nhà tiên tri tự động có thể phân biệt hành vi chương trình chính xác và không chính xác trong trường hợp chung. Phát hiện chủng tộc là một vấn đề không thể giải quyết được.
Mặt khác, các cuộc đua dữ liệu có một định nghĩa chính xác không nhất thiết liên quan đến tính chính xác, và do đó người ta có thể phát hiện ra chúng. Có nhiều hương vị của trình phát hiện cuộc đua dữ liệu (phát hiện cuộc đua dữ liệu tĩnh / động, phát hiện cuộc đua dữ liệu dựa trên khóa, phát hiện cuộc đua dữ liệu dựa trên trước, phát hiện cuộc đua dữ liệu lai). Một trình phát hiện cuộc đua dữ liệu động hiện đại là ThreadSanitizer hoạt động rất tốt trong thực tế.
Xử lý các cuộc đua dữ liệu nói chung đòi hỏi một số kỷ luật lập trình để tạo ra các cạnh xảy ra - trước khi các cạnh truy cập vào dữ liệu được chia sẻ (trong khi phát triển hoặc một khi chúng được phát hiện bằng các công cụ được đề cập ở trên). điều này có thể được thực hiện thông qua các khóa, biến điều kiện, semaphores, v.v. Tuy nhiên, người ta cũng có thể sử dụng các mô hình lập trình khác nhau như truyền tin nhắn (thay vì bộ nhớ dùng chung) để tránh các cuộc đua dữ liệu khi xây dựng.