Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² QNX/Neutrino 2. Руководство ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² QNX Realtime PlatformΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 18

Автор Π ΠΎΠ± ΠšΡ‘Ρ€Ρ‚Π΅Π½

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊ ΠΏΠΎΡ‚ΠΎΠΊΡƒ-Β«ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŽΒ» ΠΈ рассмотрим, ΠΊΠ°ΠΊ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΆΠ΄ΡƒΡ‰ΠΈΡ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ. Π’ΠΎΡ‚ Π΅Π³ΠΎ полная рСализация:

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.