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

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

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

Π’ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π·Π°ΠΊΠΎΠ½Π½Ρ‹ΠΉ вопрос: «А Ρ‡Ρ‚ΠΎ Ссли ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС?Β» Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ссли ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ 4 процСссора, ΠΈ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ ΠΏΠΎΡ‚ΠΎΠΊ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉΡΡ Π½Π° послСднСм процСссорС (с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ 3), Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, Π·Π°Ρ‚Π΅ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ ΠΏΠΎΡ‚ΠΎΠΊ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉΡΡ Π½Π° процСссорС с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ 2, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅? Вся ΠΏΡ€Π΅Π»Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ схСмы Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΏΠ»ΠΎΡ…ΠΎΠ³ΠΎ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚.

ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ β€” это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ pthread_join() блокируСтся Π½Π° thread_ids[0]. Π’Π΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΏΡƒΡΡ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ ΠΏΠΎΡ‚ΠΎΠΊ thread_ids[3]. Π­Ρ‚ΠΎ Π½Π΅ ΠΎΠΊΠ°ΠΆΠ΅Ρ‚ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ воздСйствия Π½Π° ΠΏΠΎΡ‚ΠΎΠΊ main(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΆΠ΄Π°Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π—Π°Ρ‚Π΅ΠΌ, ΠΏΡƒΡΡ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎΡ‚ΠΎΠΊ thread_ids[2]. По-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ, Π½ΠΈΠΊΠ°ΠΊΠΈΡ… послСдствий. И Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅ β€” ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎΡ‚ΠΎΠΊ thread_ids[0].

Π’ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ pthread_join() разблокируСтся, ΠΈ ΠΌΡ‹ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° for. Вторая итСрация Ρ†ΠΈΠΊΠ»Π° for ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ pthread_join() ΠΊ ΠΏΠΎΡ‚ΠΎΠΊΡƒ thread_ids[1], ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½, ΠΈ итСрация Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. ΠŸΠΎΡ‡Π΅ΠΌΡƒ? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°ΠΊ thread_ids[1], ΡƒΠΆΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ наш Ρ†ΠΈΠΊΠ» for просто «проскочит» ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ. Π’ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ синхронизированы, ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π±Π°Ρ€ΡŒΠ΅Ρ€Π°

Когда ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎ синхронизации Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main() ΠΏΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (Π² ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅ «Бинхронизация ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠ°Β», см. Π²Ρ‹ΡˆΠ΅), ΠΌΡ‹ упомянули Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° синхронизации: ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_join(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ рассмотрСли, ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π±Π°Ρ€ΡŒΠ΅Ρ€Π°.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ нашСй Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с процСссами Π² ΠΆΠΈΠ»ΠΎΠΌ Π΄ΠΎΠΌΠ΅, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ сСмья ΠΏΠΎΠΆΠ΅Π»Π°Π»Π° Π³Π΄Π΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΎΡ‚Π΄ΠΎΡ…Π½ΡƒΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π΅. Π’ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ садится Π² микроавтобус ΠΈ запускаСт Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΡŒ. И ΠΆΠ΄Π΅Ρ‚. Π’ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΆΠ΄Π°Ρ‚ΡŒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° всС Ρ‡Π»Π΅Π½Ρ‹ сСмьи Π½Π΅ сядут Π² ΠΌΠ°ΡˆΠΈΠ½Ρƒ, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π΅Ρ…Π°Ρ‚ΡŒ β€” Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΆΠ΅ ΠΌΡ‹ ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ!

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ происходит ΠΈ Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Π½Π° дисплСй. Основной ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΠ³Π΄Π° всС Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Однако, ΠΎΡ‚ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅ для сСбя ΠΎΠ΄Π½Ρƒ Π²Π°ΠΆΠ½ΡƒΡŽ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ. Π‘ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_join() ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅Π΅ разблокирования ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π΅Ρ‚ большС с Π½Π°ΠΌΠΈ; ΠΎΠ½ΠΈ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΈΡΡŒ.

Π’ случаС с Π±Π°Ρ€ΡŒΠ΅Ρ€ΠΎΠΌ, ΠΌΡ‹ ΠΆΠ΄Π΅ΠΌ «встрСчи» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ числа ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Ρƒ Π±Π°Ρ€ΡŒΠ΅Ρ€Π°. Π—Π°Ρ‚Π΅ΠΌ, ΠΊΠΎΠ³Π΄Π° Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² достигнуто, ΠΌΡ‹ ΠΈΡ… всСх Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ (Π·Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΏΡ€ΠΈ этом ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ).

Π‘Π½Π°Ρ‡Π°Π»Π° Π±Π°Ρ€ΡŒΠ΅Ρ€ слСдуСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ barrier_init():

#include <sync.h>


int barrier_init(barrier_t *barrier, const barrier_attr_t *attr, int count);

Π­Ρ‚Π° функция создаСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° Β«Π±Π°Ρ€ΡŒΠ΅Ρ€Β» ΠΏΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠΌΡƒ Π΅ΠΉ адрСсу (ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π±Π°Ρ€ΡŒΠ΅Ρ€ хранится Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ barrier) ΠΈ Π½Π°Π·Π½Π°Ρ‡Π°Π΅Ρ‚ Π΅ΠΌΡƒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² attr (ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ NULL, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ). Число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ barrier_wait(), пСрСдаСтся Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ count.

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π±Π°Ρ€ΡŒΠ΅Ρ€ создан, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ barrier_wait(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π»:

#include <sync.h>


int barrier_wait(barrier_t *barrier);

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π·Π²Π°Π» barrier_wait(), ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ count Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ barrier_init(), Π½Π΅ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ barrier_wait() (ΠΎΠ½ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Ρ‹). ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π½ΡƒΠΆΠ½ΠΎΠ΅ число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ barrier_wait(), всС эти ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Β«ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΒ».

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

/*

* barrier1.c

*/


#include <stdio.h>

#include <time.h>

#include <sync.h>

#include <sys/neutrino.h>


barrier_t barrier; // ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° Β«Π±Π°Ρ€ΡŒΠ΅Ρ€Β»


void* thread1(void *not_used) {

 time_t now;

 char buf[27];

 time(&now);

 printf("ΠŸΠΎΡ‚ΠΎΠΊ 1, врСмя старта %s", ctime_r(&now, buf));


 // Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ вычислСния

 // (вмСсто этого просто сдСлаСм sleep)

 sleep(20);


 barrier_wait(&barrier);


 // ПослС этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΡƒΠΆΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡΡ

 time(&now);

 printf("Π‘Π°Ρ€ΡŒΠ΅Ρ€ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ 1, врСмя срабатывания %s",

  ctime_r(&now, buf));

}


void* thread2(void *not_used) {

 time_t now;

 char buf[27];

 time(&now);

 printf("ΠŸΠΎΡ‚ΠΎΠΊ 2, врСмя старта %s", ctime_r(&now, buf));


 // Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ вычислСния

 // (вмСсто этого просто сдСлаСм sleep)

 sleep(40);


 barrier_wait(&barrier);


 // ПослС этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΡƒΠΆΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡΡ

 time(&now);

 printf("Π‘Π°Ρ€ΡŒΠ΅Ρ€ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ 2, врСмя срабатывания %s",

  ctime_r(&now, buf));

}


main() // Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹

{

 time_t now;

 char buf[27];


 // Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π±Π°Ρ€ΡŒΠ΅Ρ€ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ счСтчика 3

 barrier_init(&barrier, NULL, 3);

 // Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°, thread1 ΠΈ thread2

 pthread_create(NULL, NULL, thread1, NULL);

 pthread_create(NULL, NULL, thread2, NULL);


 // БСйчас Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΎΠ±Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°

 // Π–Π΄Π°Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ

 time(&now);

 printf("main(): ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Ρƒ Π±Π°Ρ€ΡŒΠ΅Ρ€Π°, врСмя %s",

  ctime_r(&now, buf));


 barrier_wait(&barrier);


 // ПослС этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΡƒΠΆΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡΡ

 time(&now);

 printf("Π‘Π°Ρ€ΡŒΠ΅Ρ€ Π² main(), врСмя срабатывания %s",

  ctime_r(&now, buf));

}

Основной ΠΏΠΎΡ‚ΠΎΠΊ создал ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° Β«Π±Π°Ρ€ΡŒΠ΅Ρ€Β» ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π» Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ счСтчика, Ρ€Π°Π²Π½Ρ‹ΠΌ числу ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ сСбя!), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Β«Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒΡΡΒ» Ρƒ Π±Π°Ρ€ΡŒΠ΅Ρ€Π°, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΠ½ «прорвСтся». Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ этот индСкс Π±Ρ‹Π» Ρ€Π°Π²Π΅Π½ 3 β€” ΠΎΠ΄ΠΈΠ½ для ΠΏΠΎΡ‚ΠΎΠΊΠ° main(), ΠΎΠ΄ΠΈΠ½ для ΠΏΠΎΡ‚ΠΎΠΊΠ° thread1() ΠΈ ΠΎΠ΄ΠΈΠ½ для ΠΏΠΎΡ‚ΠΎΠΊΠ° thread2(). Π—Π°Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€Π΅ΠΆΠ΄Π΅, ΡΡ‚Π°Ρ€Ρ‚ΡƒΡŽΡ‚ ΠΏΠΎΡ‚ΠΎΠΊΠΈ вычислСния Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ (Π² нашСм случаС это ΠΏΠΎΡ‚ΠΎΠΊΠΈ thread1() ΠΈ thread2()). Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° вмСсто привСдСния Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² графичСских вычислСний ΠΌΡ‹ просто Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ «усыпили» ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΡƒΠΊΠ°Π·Π°Π² Π² Π½ΠΈΡ… sleep(20) ΠΈ sleep(40), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ вычислСния. Для осущСствлСния синхронизации основной ΠΏΠΎΡ‚ΠΎΠΊ (main()) просто Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ сам сСбя Π½Π° Π±Π°Ρ€ΡŒΠ΅Ρ€Π΅, зная, Ρ‡Ρ‚ΠΎ Π±Π°Ρ€ΡŒΠ΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ присоСдинятся ΠΊ Π½Π΅ΠΌΡƒ.

Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Ρ€Π°Π½Π΅Π΅, с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ pthread_join() Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ для синхронизации Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° с Π½ΠΈΠΌΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΌΠ΅Ρ€Π΅Ρ‚ΡŒ. Π’ случаС ΠΆΠ΅ с Π±Π°Ρ€ΡŒΠ΅Ρ€ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΆΠΈΠ²ΡƒΡ‚ ΠΈ Ρ‡ΡƒΠ²ΡΡ‚Π²ΡƒΡŽΡ‚ сСбя Π²ΠΏΠΎΠ»Π½Π΅ Ρ…ΠΎΡ€ΠΎΡˆΠΎ. ЀактичСски, ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π², ΠΎΠ½ΠΈ просто Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ barrier_wait(). Π’ΠΎΠ½ΠΊΠΎΡΡ‚ΡŒ здСсь Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ обязаны ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ эти ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄Π΅Π»Π°Ρ‚ΡŒ дальшС! Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠΉ ΠΌΡ‹ Π½Π΅ Π΄Π°Π»ΠΈ ΠΈΠΌ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ задания для Π½ΠΈΡ… β€” просто ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ‚Π°ΠΊ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π»ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ. Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π·Π°Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ вычислСния.

НСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΡ€ΠΈ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΌ процСссорС

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ слСгка ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ наш ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΈΠ½ΠΎΠ³Π΄Π° Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π΄Π°ΠΆΠ΅ Π² систСмС с ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΌ процСссором.

Π’ Ρ‚Π°ΠΊΠΎΠΌ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠ΄ΠΈΠ½ ΡƒΠ·Π΅Π» Π½Π° сСти отвСтствСнСн Π·Π° вычислСниС строк растра (ΠΊΠ°ΠΊ ΠΈ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠΉ, рассмотрСнном Π²Ρ‹ΡˆΠ΅). Однако, ΠΊΠΎΠ³Π΄Π° строка рассчитана, Π΅Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹ ΠΏΠΎ сСти Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΡƒΠ·Π»Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ отобраТСния. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ модифицированная функция main() (Π½Π° основС ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π±Π΅Π· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²):

int main(int argc, char **argv) {

 int x1;


 ... // Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ


 for (x1 = 0; x1 < num_x_lines; x1++) {

  do _one_line(x1); // ΠžΠ±Π»Π°ΡΡ‚ΡŒ Β«Π‘Β» Π½Π° схСмС

  tx_one_line_wait_ack(x1); // ΠžΠ±Π»Π°ΡΡ‚ΠΈ Β«XΒ» ΠΈ Β«WΒ» Π½Π° схСмС

 }

}

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‰ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ вмСсто этого Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ tx_one_line_wait_ack(). Π”Π°Π»Π΅Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ с достаточно ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΉ ΡΠ΅Ρ‚ΡŒΡŽ, Π½ΠΎ процСссор Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π΅ занимаСтся ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ Π΄Π°Π½Π½Ρ‹Ρ… β€” ΠΎΠ½ просто ΠΎΡ‚Π΄Π°Π΅Ρ‚ ΠΈΡ… Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΌ срСдствам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ сами позаботятся ΠΎΠ± ΠΈΡ… ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅. Ѐункция tx_one_line_wait_ack() ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΌ срСдствам, ΠΈ послС этого, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ подтвСрТдСния ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒ процСссорноС врСмя Π²ΠΎΠΎΠ±Ρ‰Π΅.