ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΡΠ΅ΠΏΠ΅ΡΡ ΠΊ ΠΏΠΎΡΠΎΠΊΡ-Β«ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΒ» ΠΈ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ ΠΆΠ΄ΡΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ. ΠΠΎΡ Π΅Π³ΠΎ ΠΏΠΎΠ»Π½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ:
producer() {
while (1) {
// ΠΠ΄Π°ΡΡ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ ΠΎΡ ΠΎΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΡ...
pthread_sleepon_lock();
data_ready = 1;
pthread_sleepon_signal(&data_ready);
pthread_sleepon_unlock();
}
}
ΠΠ°ΠΊ Π²Ρ Π²ΠΈΠ΄ΠΈΡΠ΅, ΠΏΠΎΡΠΎΠΊ-Β«ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΒ» ΡΠ°ΠΊΠΆΠ΅ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΌΡΡΠ΅ΠΊΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΌΠΎΠ½ΠΎΠΏΠΎΠ»ΡΠ½ΡΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ»Π°Π³Ρ data_ready ΠΏΠ΅ΡΠ΅Π΄ Π΅Π³ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΎΠΉ.
ΠΠ»ΠΈΠ΅Π½ΡΠ° Β«ΠΏΡΠΎΠ±ΡΠΆΠ΄Π°Π΅ΡΒ» Π½Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ»Π°Π³Π° data_ready Π² Π΅Π΄ΠΈΠ½ΠΈΡΡ (1), Π° Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ pthread_sleepon_signal()!
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡΠ΅Π΅ Π² ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΡΡ . ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» ΠΈ Β«ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΒ» ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΠ·Π½Π°ΡΠ°Π΅Ρ CONDVAR ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ ΠΆΠ΄ΡΡΠ΅ΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ΅ ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ MUTEX ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΌΡΡΠ΅ΠΊΡΠ° READY ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ, Ρ.Π΅., Π³ΠΎΡΠΎΠ² Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΈΠ»ΠΈ ΡΠΆΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ INTERRUPT ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ ΠΎΡ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΡ ΡΡΠ΅Π΄ΡΡΠ² ΠΠ΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΠ»Π°Π΄Π΅Π»Π΅Ρ ΠΌΡΡΠ΅ΠΊΡΠ° Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Β«ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΒ» Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΌΡΡΠ΅ΠΊΡ Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» READY INTERRUPT Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΠ»Π°Π³ data_ready Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» READY INTERRUPT ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ pthread_sleepon_wait() Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» READY INTERRUPT ΡΡΠ½ΠΊΡΠΈΡ pthread_sleepon_wait() ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΌΡΡΠ΅ΠΊΡ ΠΌΡΡΠ΅ΠΊΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π΅Π½ READY INTERRUPT ΡΡΠ½ΠΊΡΠΈΡ pthread_sleepon_wait() Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ ΠΌΡΡΠ΅ΠΊΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π΅Π½ CONDVAR INTERRUPT ΠΏΠ°ΡΠ·Π° Π΄ΠΎ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ ΠΌΡΡΠ΅ΠΊΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π΅Π½ CONDVAR INTERRUPT Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΠ΅ ΡΡΠ΅Π΄ΡΡΠ²Π° Π³Π΅Π½Π΅ΡΠΈΡΡΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΌΡΡΠ΅ΠΊΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π΅Π½ CONDVAR READY Β«ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΒ» Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΌΡΡΠ΅ΠΊΡ Β«ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΒ» CONDVAR READY Β«ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΒ» ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠ»Π°Π³ data_ready Β«ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΒ» CONDVAR READY Β«ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΒ» Π²ΡΠ·ΡΠ²Π°Π΅Ρ pthread_sleepon_signal() Β«ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΒ» CONDVAR READY Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» Β«ΠΏΡΠΎΠ±ΡΠΆΠ΄Π°Π΅ΡΡΡΒ», ΡΡΠ½ΠΊΡΠΈΡ pthread_sleepon_wait() ΠΏΡΡΠ°Π΅ΡΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΌΡΡΠ΅ΠΊΡ Β«ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΒ» MUTEX READY Β«ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΒ» ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΌΡΡΠ΅ΠΊΡ ΠΌΡΡΠ΅ΠΊΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π΅Π½ MUTEX READY Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΌΡΡΠ΅ΠΊΡ Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» READY READY Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» READY READY Β«ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΒ» ΠΆΠ΄Π΅Ρ Π½ΠΎΠ²ΡΡ Π΄Π°Π½Π½ΡΡ ΠΎΡ Π°ΠΏΠΏΠ°ΡΠ°ΡΡΡΡ Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» READY INTERRUPT ΠΏΠ°ΡΠ·Π° (Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅) Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» READY INTERRUPT Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΈ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΌΡΡΠ΅ΠΊΡ ΠΌΡΡΠ΅ΠΊΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π΅Π½ READY INTERRUPT Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π² Π½Π°ΡΠ°Π»ΠΎ ΡΠΈΠΊΠ»Π° ΠΈ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΌΡΡΠ΅ΠΊΡ Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» READY INTERRUPTΠΠΎΡΠ»Π΅Π΄Π½ΡΡ ΡΡΡΠΎΠΊΠ° Π² ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΏΠΎΠ²ΡΠΎΡΡΠ΅Ρ ΠΏΠ΅ΡΠ²ΡΡ β ΠΌΡ ΡΠΎΠ²Π΅ΡΡΠΈΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ»Π½ΡΠΉ ΡΠΈΠΊΠ».
ΠΠ°ΠΊΠΎΠ²ΠΎ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ»Π°Π³Π° data_ready? ΠΠ½ ΡΠ»ΡΠΆΠΈΡ Π΄Π»Ρ Π΄Π²ΡΡ ΡΠ΅Π»Π΅ΠΉ:
β’ ΠΠ½ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ»Π°Π³ΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ β ΠΏΠΎΡΡΠ΅Π΄Π½ΠΈΠΊΠΎΠΌ ΠΌΠ΅ΠΆΠ΄Ρ Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΌΒ» ΠΈ Β«ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΌΒ», ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΠΈΠΌ Π½Π° ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΡΠ»ΠΈ ΡΠ»Π°Π³ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ 1, ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π΄Π°Π½Π½ΡΠ΅ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ; Π΅ΡΠ»ΠΈ ΡΡΠΎΡ ΡΠ»Π°Π³ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ 0, ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π΄Π°Π½Π½ΡΡ Π½Π΅Ρ, ΠΈ ΠΏΠΎΡΠΎΠΊ-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½.
β’ ΠΠ½ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ Β«ΠΌΠ΅ΡΡΠ°, Π³Π΄Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΡΠΎ ΠΆΠ΄ΡΡΠ΅ΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΎΠΉΒ». ΠΠΎΠ»Π΅Π΅ ΡΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ Π³ΠΎΠ²ΠΎΡΡ, Π°Π΄ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ data_ready ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΠΆΠ΄ΡΡΠ°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°. ΠΡ Π·Π°ΠΏΡΠΎΡΡΠΎ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ Β«(void*)12345Β» Π²ΠΌΠ΅ΡΡΠΎ Β«&data_readyΒ» β Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ ΠΆΠ΄ΡΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ, ΡΡΠΎ ΡΡΠΎ Π·Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ, Π»ΠΈΡΡ Π±Ρ ΠΎΠ½ Π±ΡΠ» ΡΠ½ΠΈΠΊΠ°Π»Π΅Π½ ΠΈ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΡΡ. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΆΠ΅ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° Π°Π΄ΡΠ΅ΡΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΅ΡΡΡ Π½Π°Π΄Π΅ΠΆΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ Π½ΠΎΠΌΠ΅Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π΅ Π±ΡΠ²Π°Π΅Ρ ΠΆΠ΅ Π΄Π²ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌ Π°Π΄ΡΠ΅ΡΠΎΠΌ!
β’ Π ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ ΡΠ°Π·Π»ΠΈΡΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ pthread_sleepon_signal() ΠΈ pthread_sleepon_broadcast() ΠΌΡ Π΅ΡΠ΅ Π²Π΅ΡΠ½Π΅ΠΌΡΡ Π² ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠ΅ ΠΎΠ± ΡΡΠ»ΠΎΠ²Π½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ .
Π£ΡΠ»ΠΎΠ²Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅
Π£ΡΠ»ΠΎΠ²Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ (ΠΈΠ»ΠΈ Β«condvarsΒ») ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ ΠΎΠΆΠΈ Π½Π° ΠΆΠ΄ΡΡΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π»ΠΈ Π²ΡΡΠ΅. Π Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, ΠΆΠ΄ΡΡΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ β ΡΡΠΎ Π½Π°Π΄ΡΡΡΠΎΠΉΠΊΠ° Π½Π°Π΄ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΠΌ ΡΡΠ»ΠΎΠ²Π½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ , ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΡΡΠΎΠΌΡ Π² ΡΠ°Π±Π»ΠΈΡΠ΅, ΠΈΠ»Π»ΡΡΡΡΠΈΡΠΎΠ²Π°Π²ΡΠ΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΆΠ΄ΡΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ, Ρ Π½Π°Ρ Π²ΡΡΡΠ΅ΡΠ°Π»ΠΎΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ CONDVAR. Π€ΡΠ½ΠΊΡΠΈΡ pthread_cond_wait() ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ ΠΌΡΡΠ΅ΠΊΡ, ΠΆΠ΄Π΅Ρ, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΌΡΡΠ΅ΠΊΡ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_sleepon_wait().
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΎΠΏΡΡΡΠΈΠΌ Π²ΡΡΡΠΏΠ»Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ±ΡΠ°ΡΠΈΠΌΡΡ ΠΊ Π½Π°ΡΠ΅ΠΌΡ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΎ Β«ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅Β» ΠΈ Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅Β» ΠΈΠ· ΡΠ°Π·Π΄Π΅Π»Π° ΠΎ ΠΆΠ΄ΡΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°Ρ , Π½ΠΎ Π²ΠΌΠ΅ΡΡΠΎ ΠΆΠ΄ΡΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ»ΠΎΠ²Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅. Π Π·Π°ΡΠ΅ΠΌ ΡΠΆΠ΅ ΠΎΠ±ΡΡΠ΄ΠΈΠΌ Π²ΡΠ·ΠΎΠ²Ρ.
/*
* cp1.c
*/
#include <stdio.h>
#include <pthread.h>
int data_ready = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t condvar = PTHREAD_COND_INITIALIZER;
void* consumer(void *notused){
printf("ΠΡΠΎ ΠΏΠΎΡΠΎΠΊ-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ...\n");
while (1) {
pthread_mutex_lock(&mutex);
while (!data_ready) {
pthread_cond_wait(&condvar, &mutex);
}
// ΠΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅
printf("ΠΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ: ΠΏΠΎΠ»ΡΡΠΈΠ» Π΄Π°Π½Π½ΡΠ΅ ΠΎΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ\n");
data_ready = 0;
pthread_cond_signal(&condvar);
pthread_mutex_unlock(&mutex);
}
}
void* producer (void *notused) {
printf("ΠΡΠΎ ΠΏΠΎΡΠΎΠΊ-ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ...\n");
while (1) {
// ΠΠΎΠ»ΡΡΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΎΡ ΠΎΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΡ
// (ΠΌΡ ΠΈΠΌΠΈΡΠΈΡΡΠ΅ΠΌ ΡΡΠΎ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ sleep(1))
sleep(1);
printf("ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ: ΠΏΠΎΠ»ΡΡΠΈΠ» Π΄Π°Π½Π½ΡΠ΅ ΠΎΡ h/w\n");
pthread_mutex_lock(&mutex);
while (data_ready) {
pthread_cond_wait(&condvar, &mutex);
}
data_ready = 1;
pthread_cond_signal(&condvar);
pthread_mutex_unlock(&mutex);
}
}
main() {
printf(
"ΠΠ°ΡΠ°Π»ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΌ ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΌ...\n");
// Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΏΠΎΡΠΎΠΊ-ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΈ ΠΏΠΎΡΠΎΠΊ-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ
pthread_create(NULL, NULL, producer, NULL);
pthread_create(NULL, NULL, consumer, NULL);
// ΠΠ°ΡΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ
sleep(20);
}
ΠΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ Π² Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ ΠΏΠΎΡ ΠΎΠΆ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΆΠ΄ΡΡΠ΅ΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΠΎΡΠ»ΠΈΡΠΈΡΠΌΠΈ (ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΡΠ·ΠΎΠ²ΠΎΠ² printf(), Π° ΡΠ°ΠΊΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΡ main(), ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΌΠΎΠ³Π»Π° ΡΠ°Π±ΠΎΡΠ°ΡΡ!) ΠΠ΅ΡΠ²ΠΎΠ΅ ΠΎΡΠ»ΠΈΡΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠΎΡΠ°Π΅ΡΡΡ Π² Π³Π»Π°Π·Π°, β Π·Π΄Π΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ Π½ΠΎΠ²ΡΠΉ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ , pthread_cond_t. ΠΡΠΎ ΠΏΡΠΎΡΡΠΎ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΡ Π΄Π»Ρ ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ; ΠΌΡ Π½Π°Π·Π²Π°Π»ΠΈ Π½Π°ΡΡ ΡΡΠ»ΠΎΠ²Π½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ condvar.