Rumah > pembangunan bahagian belakang > C++ > Adakah Memanggil `pthread_cond_signal` Tanpa Mutex Selamat?

Adakah Memanggil `pthread_cond_signal` Tanpa Mutex Selamat?

DDD
Lepaskan: 2024-12-03 16:53:10
asal
512 orang telah melayarinya

Is Calling `pthread_cond_signal` Without a Mutex Safe?

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);
Salin selepas log masuk

Proses B (Salah):

condition = TRUE;
pthread_cond_signal(&cond);
Salin selepas log masuk

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);
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan