Tidak mungkin dua (atau lebih) utas mendapatkan kunci pada saat yang sama. Ada beberapa jenis metode sinkronisasi misalnya:
Tunggu aktif - kunci putar
Kodesemu:
1. while ( xchg(lock, 1) == 1); - entry protocole
XCHG adalah contoh operasi atom (ada pada arsitektur x86) yang pertama-tama menetapkan nilai baru untuk variabel "kunci" dan kemudian mengembalikan nilai lama. Atomic berarti tidak dapat diinterupsi - dalam contoh di atas antara menetapkan nilai baru dan mengembalikan nilai lama. Atomic - hasil deterministik tidak peduli apa.
2. Your code
3. lock = 0; - exit protocol
Ketika kunci sama dengan 0 utas lainnya dapat masuk ke bagian kritis - sementara loop berakhir.
Penangguhan utas - misalnya menghitung semafor
Ada dua operasi atom .Wait()
dan .Signal()
dan kami memiliki variabel integer, sebut saja int currentValue
.
Wait():
if (currentValue > 0) currentValue -= 1;
else suspend current thread;
Signal():
If there exists thread suspended by semaphore wake up one of them
Else currentValue += 1;
Sekarang memecahkan masalah bagian kritis sangat mudah:
Kodesemu:
mySemaphore.Wait();
do some operations - critical section
mySemaphore.Signal();
Biasanya API utas pemrograman Anda harus memberi Anda kemampuan untuk menentukan utas bersamaan maksimum di bagian kritis semaphore. Jelas ada lebih banyak jenis sinkronisasi dalam sistem multithreaded (mutex, monitor, binary semaphore, dll) tetapi mereka didasarkan pada ide-ide di atas. Orang bisa berargumen bahwa metode yang menggunakan penangguhan thread harus lebih disukai daripada menunggu aktif (jadi cpu tidak sia-sia) - itu tidak selalu benar. Ketika utas sedang ditangguhkan - operasi mahal yang disebut sakelar konteks terjadi. Namun masuk akal ketika waktu tunggu pendek (jumlah utas ~ jumlah inti).