"Kondisi ras" ada ketika kode multithreaded (atau paralel) yang akan mengakses sumber daya bersama bisa melakukannya sedemikian rupa sehingga menyebabkan hasil yang tidak terduga.
Ambil contoh ini:
for ( int i = 0; i < 10000000; i++ )
{
x = x + 1;
}
Jika Anda memiliki 5 utas yang mengeksekusi kode ini sekaligus, nilai x TIDAK AKAN berakhir menjadi 50.000.000. Itu sebenarnya akan bervariasi dengan setiap lari.
Ini karena, agar setiap untaian menambah nilai x, mereka harus melakukan hal berikut: (disederhanakan, jelas)
Ambil nilai x
Tambahkan 1 ke nilai ini
Simpan nilai ini ke x
Setiap utas dapat pada setiap langkah dalam proses ini kapan saja, dan mereka dapat saling menginjak ketika sumber daya bersama dilibatkan. Keadaan x dapat diubah oleh utas lainnya selama waktu antara x sedang dibaca dan ketika itu ditulis kembali.
Katakanlah utas mengambil nilai x, tetapi belum menyimpannya. Thread lain juga dapat mengambil yang sama nilai x (karena tidak ada benang telah berubah itu belum) dan kemudian mereka berdua akan menyimpan sama nilai (x + 1) kembali x!
Contoh:
Thread 1: dibaca x, nilainya 7
Thread 1: tambahkan 1 ke x, nilainya sekarang 8
Thread 2: dibaca x, nilainya 7
Thread 1: menyimpan 8 in x
Thread 2: menambahkan 1 ke x, nilainya sekarang 8
Thread 2: menyimpan 8 in x
Kondisi lomba dapat dihindari dengan menggunakan semacam mekanisme penguncian sebelum kode yang mengakses sumber daya bersama:
for ( int i = 0; i < 10000000; i++ )
{
//lock x
x = x + 1;
//unlock x
}
Di sini, jawabannya muncul 50.000.000 setiap kali.
Untuk lebih lanjut tentang penguncian, cari: mutex, semaphore, bagian kritis, sumber daya bersama.