Adakah Memanggil pthread_cond_signal Tanpa Mutex Mengganggu Isyarat?
Sesetengah literatur mencadangkan bahawa memanggil pthread_cond_signal memerlukan mengunci mutex terlebih dahulu dan membuka kuncinya selepas itu. Walau bagaimanapun, bolehkah anda memanggil pthread_cond_signal atau pthread_cond_broadcast tanpa penguncian mutex?
Jawapan:
Tidak, adalah tidak selamat untuk memanggil pthread_cond_signal atau pthread_cond_broadcast terlebih dahulu. Ini digambarkan melalui contoh mudah yang melibatkan dua proses (A dan B).
Proses A:
pthread_mutex_lock(&mutex); while (condition == FALSE) pthread_cond_wait(&cond, &mutex); pthread_mutex_unlock(&mutex);
Proses B (Salah):
condition = TRUE; pthread_cond_signal(&cond);
Jika keadaan bermula sebagai FALSE dan Proses B cuba memberi isyarat tanpa penguncian mutex, ia adalah mungkin untuk Proses A terlepas isyarat bangun kerana arahan terputus.
Proses B (Betul):
pthread_mutex_lock(&mutex); condition = TRUE; pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex);
Mengunci mutek dalam Proses B menghalang isu ini, memastikan Proses A menerima isyarat bangun.
Nota: Walaupun secara teknikal mungkin untuk bergerak pthread_cond_signal() selepas pthread_mutex_unlock(), ia tidak disyorkan kerana ia mengurangkan kecekapan penjadualan benang.
Atas ialah kandungan terperinci Adakah Memanggil `pthread_cond_signal` Tanpa Mutex Selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!