Π ΡΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π·Π°ΠΊΠΎΠ½Π½ΡΠΉ Π²ΠΎΠΏΡΠΎΡ: Β«Π ΡΡΠΎ Π΅ΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΊΠΈ Π·Π°Π²Π΅ΡΡΠ°Ρ ΡΠ°Π±ΠΎΡΡ Π² ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅?Β» ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, Π΅ΡΠ»ΠΈ ΠΈΠΌΠ΅ΡΡΡΡ 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() ΠΏΠΎΡΡΠ΅Π±ΡΠ΅Ρ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π° ΡΠΎ, ΡΡΠΎΠ±Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π΄Π°Π½Π½ΡΡ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΠΌ ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌ, ΠΈ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ ΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ Π΄Π°Π½Π½ΡΡ ΠΎΡ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠ·Π»Π°, Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΡΡΠ΅Π±Π»ΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π²ΠΎΠΎΠ±ΡΠ΅.