β’ ΠΠΊΠ»ΡΡΠΈΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ #define _MT Π²ΠΎ Π²ΡΠ΅ ΠΈΡΡ ΠΎΠ΄Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π‘.
β’ ΠΠΎΠ±Π°Π²ΡΡΠ΅ Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΠΉ ΡΠ°ΠΉΠ» <process.h>, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ _beginthreadex ΠΈ _endthreadex.
β’ Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ _beginthreadex; Π½Π΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΠΉΡΠ΅ Π΄Π»Ρ ΡΡΠΎΠΉ ΡΠ΅Π»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ CreateThread.
β’ ΠΠ°Π²Π΅ΡΡΠΈΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ _endthreadex ΠΈΠ»ΠΈ ΠΏΡΠΎΡΡΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ return Π² ΠΊΠΎΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠ°.
Π ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π Π²Ρ Π½Π°ΠΉΠ΄Π΅ΡΠ΅ ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΠΌΠΎΠΆΠ½ΠΎ, ΠΈ Π΄Π°ΠΆΠ΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ, ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ _ΠΠ’ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π² ΡΡΠ΅Π΄Π΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.
ΠΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊ Π±ΡΠ΄ΡΡ ΠΏΠΎΡΡΡΠΎΠ΅Π½Ρ Π²ΡΠ΅ Π½Π°ΡΠΈ ΠΏΡΠΈΠΌΠ΅ΡΡ, ΠΈ ΡΡΠ½ΠΊΡΠΈΡ CreateThread Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡΠ΄Π΅Ρ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ Π΄Π°ΠΆΠ΅ Π² ΡΠ΅Ρ ΡΠ»ΡΡΠ°ΡΡ , ΠΊΠΎΠ³Π΄Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π‘ Π² ΡΡΠ½ΠΊΡΠΈΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ.
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ
ΠΡΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ΄Π΅Π»ΡΡΡ ΡΠ°ΠΌΠΎΠ΅ ΠΏΡΠΈΡΡΠ°Π»ΡΠ½ΠΎΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡΠΎΠΌΡ, ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π² ΡΠ΅Ρ ΡΠ»ΡΡΠ°ΡΡ , ΠΊΠΎΠ³Π΄Π° ΡΠ΅ΡΡ ΠΈΠ΄Π΅Ρ ΠΎ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ². ΠΠ΄Π½Π° ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΉ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅ΡΡΡ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π² Π³Π»Π°Π²Π΅ 12 (ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 12.4), Π³Π΄Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° DLL Π΄Π»Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ.
ΠΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΈΠΌΠ΅Ρ Π² Π³Π»Π°Π²Π΅ 12 (ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 12.5) ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅Ρ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΡΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ DllMain ΠΈ TLS, ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π΄Π°Π»Π΅Π΅ Π² Π½Π°ΡΡΠΎΡΡΠ΅ΠΉ Π³Π»Π°Π²Π΅.
ΠΡΠΈΠΌΠ΅Ρ: ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°
Π ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ 6.1 (grepMP) Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠ° ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°Π±Π»ΠΎΠ½Π° Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠ°ΠΉΠ»Π°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ ΠΏΡΠΎΡΠ΅ΡΡΡ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 7.1 (grepMT), ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΠΈΡΠΊΠ° ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°Π±Π»ΠΎΠ½Π° grep, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΠΈΡΠΊΠ° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ Π² ΡΠ°ΠΌΠΊΠ°Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°. ΠΠΎΠ΄ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΠΈΡΠΊΠ° ΠΎΡΠ½ΠΎΠ²Π°Π½ Π½Π° Π²ΡΠ·ΠΎΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΠΉ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π‘. ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Π° ΡΠΎΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π»Π°ΡΡ Π² Π²Π°ΡΠΈΠ°Π½ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ².
ΠΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π° Π΄Π°ΠΆΠ΅ Π±Π΅Π· ΠΏΡΠΈΠ²Π»Π΅ΡΠ΅Π½ΠΈΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ², ΠΎΠΏΠΈΡΠ°Π½Π½ΡΡ Π² Π³Π»Π°Π²Π΅ 14. Π Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠΌ Π²Π²ΠΎΠ΄ΠΎΠΌ/Π²ΡΠ²ΠΎΠ΄ΠΎΠΌ Ρ ΡΡΠ°ΡΡΠΈΠ΅ΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΈΠ»ΠΈ Π»ΡΠ±ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π° Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ. ΠΠΎ ΠΌΠ½Π΅Π½ΠΈΡ Π°Π²ΡΠΎΡΠ°, ΡΠΏΠΎΡΠΎΠ± ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π°, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΠΌΡΠΉ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΡΠΌ, Π° ΡΡΠ°Π²Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ Π°Π½Π°Π»ΠΈΠ· ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ², ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΡΠΉ Π² Π³Π»Π°Π²Π΅ 14, ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π²Π°ΠΌ Π²ΡΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΠΎΡ ΡΡΠ΅Ρ.
ΠΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΡΡΠΎ Π² ΡΠΎΡΠ΅ΡΠ°Π½ΠΈΠΈ Ρ ΠΏΠΎΡΡΠ°ΠΌΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π° ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ, Π° ΡΠ°ΡΡΠΎ ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΌ ΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ Π² ΡΠ΅Ρ ΡΠ»ΡΡΠ°ΡΡ , ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΎΡΠ΅Π½Ρ Π²Π΅Π»ΠΈΠΊΠΎ.
Π ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΠ²Π½ΡΡ ΡΠ΅Π»ΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ grepMT Π²Π²Π΅Π΄Π΅Π½ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ grepMP. Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠ½ΠΊΡΠΈΡ WaiForMultipleObjects ΠΎΠΆΠΈΠ΄Π°Π΅Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π½Π΅ Π²ΡΠ΅Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ², Π° ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ. Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡ Π±Π΅Π· ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π΄ΡΡΠ³ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ². Π Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ»ΡΡΠ°Π΅ ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π±ΡΠ΄Π΅Ρ ΠΌΠ΅Π½ΡΡΡΡΡ ΠΎΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΊ Π΄ΡΡΠ³ΠΎΠΌΡ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π»Π΅Π³ΠΊΠΎ Π²ΠΈΠ΄ΠΎΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π»ΠΈΡΡ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ ΡΠΊΠ°Π·Π°Π½ΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅; Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΡΠΌΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ grepMP.
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π² 64 ΠΏΠΎΡΠΎΠΊΠ°, ΠΎΠ±ΡΡΠ»ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ MAXIMUM_WAIT_OBJECTS, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ WaitForMultipleObjects. ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ Π² Π±ΠΎΠ»ΡΡΠ΅ΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΎΡΠ³Π°Π½ΠΈΠ·ΡΠΉΡΠ΅ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΉ WaitForSingleObjects ΠΈΠ»ΠΈ WaitForMultipleObjects ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΡΠΈΠΊΠ».
ΠΡΠ΅Π΄ΠΎΡΡΠ΅ΡΠ΅ΠΆΠ΅Π½ΠΈΠ΅
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° grepMP ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ Π²Π²ΠΎΠ΄/Π²ΡΠ²ΠΎΠ΄ Π² ΡΠΎΠΌ ΡΠΌΡΡΠ»Π΅, ΡΡΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ΅ ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠ΅ ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΡΡΡΡΡ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΡΠ΅Π½ΠΈΡ. ΠΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ΅ ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠ°ΠΉΠ»Π°, Π΅ΡΠ»ΠΈ Ρ Π½Π΅Π³ΠΎ ΠΈΠΌΠ΅ΡΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ (ΠΎΠ±ΡΡΠ½ΠΎ, ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°). ΠΡΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Ρ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ CreateFile, Π° Π½Π΅ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ DuplicateHandle. Π Π³Π»Π°Π²Π΅ 14 ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ Π²Π²ΠΎΠ΄/Π²ΡΠ²ΠΎΠ΄, ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΠΌΡΠΉ ΠΊΠ°ΠΊ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, ΡΠ°ΠΊ ΠΈ Π±Π΅Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², Π° Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅, Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠΌ Π½Π° Web-ΡΠ°ΠΉΡΠ΅ (ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° atouMT, ΠΎΠΏΠΈΡΠ°Π½Π½Π°Ρ Π² Π³Π»Π°Π²Π΅ 14), ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π° Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΈ ΡΠΎΠΌΡ ΠΆΠ΅ ΡΠ°ΠΉΠ»Ρ.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 7.1. grepMT: ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°Π±Π»ΠΎΠ½Π°/* ΠΠ»Π°Π²Π° 7. grepMT. */
/* ΠΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°Π±Π»ΠΎΠ½Π° β Π²Π΅ΡΡΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ°Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ². */
#include "EvryThng.h"
typedef struct { /* Π‘ΡΡΡΠΊΡΡΡΠ° Π΄Π°Π½Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠ° ΠΏΠΎΠΈΡΠΊΠ°. */
int argc;
TCHAR targv[4][ΠΠΠ₯_Π ΠΠ’Π];
} GREP_THREAD_ARG;
typedef GREP_THREAD_ARG *PGR_ARGS;
static DWORD WINAPI ThGrep(PGR_ARGS pArgs);
int _tmain(int argc, LPTSTR argv[]) {
GREP_THREAD_ARG * gArg;
HANDLE * tHandle;
DWORD ThdIdxP, ThId, ExitCode;
TCHAR CmdLine[MAX_COMMAND_LINE];
int iThrd, ThdCnt;
STARTUPINFO Startup;
PROCESS_INFORMATION ProcessInfo;
GetStartupInfo(&StartUp);
/* ΠΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ: ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ ΠΏΠΎΠΈΡΠΊΠ° Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ "grep" Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°. */
tHandle = malloc((argc β 2) * sizeof(HANDLE));
gArg = malloc((argc β 2) * sizeof(GREP_THREAD_ARG));
for (iThrd = 0; iThrd < argc β 2; iThrd++) {
_tcscpy(gArg[iThrd].targv[1], argv[1]); /* Pattern. */
_tcscpy(gArg[iThrd].targv[2], argv[iThrd + 2]);
GetTempFileName /* ΠΠΌΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°. */
(".", "Gre", 0, gArg[iThrd].targv[3]);
gArg[iThrd].argc = 4;
/* Π‘ΠΎΠ·Π΄Π°ΡΡ ΡΠ°Π±ΠΎΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ. */
tHandle[iThrd] = (HANDLE)_beginthreadex(NULL, 0, ThGrep, &gArg[iThrd], 0, &ThId);
}
/* ΠΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²ΠΈΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ Π²ΡΠ²ΠΎΠ΄ Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π° ΡΠΏΠΈΡΠΊΠ° ΡΠ°ΠΉΠ»ΠΎΠ². */
Startup.dwFlags = STARTF_USESTDHANDLES;
Startup.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
/* ΠΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π²ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ. ΠΠΆΠΈΠ΄Π°ΡΡ ΠΈΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ. */
ThdCnt = argc β 2;
while (ThdCnt > 0) {
ThdIdxP = WaitForMultipleObjects(ThdCnt, tHandle, FALSE, INFINITE);
iThrd = (int)ThdIdxP β (int)WAIT_OBJECT_0;
GetExitCodeThread(tHandle [iThrd], &ExitCode);
CloseHandle(tHandle [iThrd]);
if (ExitCode ==0) { /* Π¨Π°Π±Π»ΠΎΠ½ Π½Π°ΠΉΠ΄Π΅Π½. */
if (argc > 3) {
/* ΠΡΠ²Π΅ΡΡΠΈ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π°, Π΅ΡΠ»ΠΈ ΠΈΠΌΠ΅Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΉΠ»ΠΎΠ². */
_tprintf(_T("\n**Π Π΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΏΠΎΠΈΡΠΊΠ° β ΡΠ°ΠΉΠ»: %s\n"), gArg[iThrd].targv [2]);
fflush(stdout);
}
/* ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ "cat" Π΄Π»Ρ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ². */
_stprintf(CmdLine, _T("%s%s"), _Π’("cat "), gArg [iThrd].targv[3]);
CreateProcess(NULL, CmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &StartUp, &ProcessInfo);
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
}
DeleteFile(gArg[iThrd].targv[3]);
/* Π‘ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠ°ΡΡΠΈΠ²Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΈ ΠΈΠΌΠ΅Π½ ΡΠ°ΠΉΠ»ΠΎΠ². */
tHandle[iThrd] = tHandle[ThdCnt β 1];
_tcscpy(gArg[iThrd].targv[3], gArg[ThdCnt β 1].targv[3]);
_tcscpy(gArg[iThrd].targv[2], gArg[ThdCnt β 1].targv[2]);
ThdCnt--;
}
}
/* ΠΡΠΎΡΠΎΡΠΈΠΏ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠ°:
static DWORD WINAPI ThGrep(PGR_ARGS pArgs){ } */
ΠΠΎΡΠΎΠΊΠΈ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΡ grepMP ΠΈ grepMT ΠΏΠΎ ΡΠ²ΠΎΠ΅ΠΉ ΡΡΡΡΠΊΡΡΡΠ΅ ΠΈ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠΎΠΏΠΎΡΡΠ°Π²ΠΈΠΌΡ Π΄ΡΡΠ³ Ρ Π΄ΡΡΠ³ΠΎΠΌ, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΊΠ°ΠΊ ΠΈ ΡΠ»Π΅Π΄ΠΎΠ²Π°Π»ΠΎ ΠΎΠΆΠΈΠ΄Π°ΡΡ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° grepMT Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΠ·ΡΠ΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠΎΠΊΠΎΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΄ΡΠΎΠΌ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½Π΅Π΅, ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ. Π ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΡΡΠΎ ΡΡΠΈ ΡΠ΅ΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, ΠΈ ΡΡΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π·Π°ΠΌΠ΅ΡΠ½ΠΎ Π² ΡΠ΅Ρ ΡΠ»ΡΡΠ°ΡΡ , ΠΊΠΎΠ³Π΄Π° ΡΠ°ΠΉΠ»Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Ρ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ Π΄ΠΈΡΠΊΠ°Ρ . ΠΠ±Π° Π²Π°ΡΠΈΠ°Π½ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΏΠΎΡΠΎΠ±Π½Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² SMP-ΡΠΈΡΡΠ΅ΠΌΠ°Ρ , ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ»ΡΡΡΠ°Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Ρ ΠΎΠ±ΡΠ΅Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ (ΠΈΡΡΠ΅ΠΊΡΠ΅Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ); ΠΏΠΎΡΠΎΠΊΠΈ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ Π»ΠΈ ΠΎΠ½ΠΈ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΈ ΡΠΎΠΌΡ ΠΆΠ΅ ΠΈΠ»ΠΈ ΡΠ°Π·Π½ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌ, ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°Ρ . ΠΠ·ΠΌΠ΅ΡΠ΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΏΡΠ΅Π²ΡΡΠ°Π΅Ρ ΠΎΠ±ΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ°ΡΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ Π² Π²ΠΈΠ΄Π΅ ΡΡΠΌΠΌΠ°ΡΠ½ΠΎΠΉ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ Π΄Π»Ρ Π²ΡΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠ².
Π ΡΠΎ ΠΆΠ΅ Π²ΡΠ΅ΠΌΡ, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π²Π΅ΡΡΠΌΠ° ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΠΎΠ΅ Π·Π°Π±Π»ΡΠΆΠ΄Π΅Π½ΠΈΠ΅, ΡΡΡΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΡΠΌΠ΅ΡΠ΅Π½Π½ΡΠΉ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈΠ·ΠΌ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΡΠ°Π΅ΡΡΡ Π»ΠΈ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², ΠΊΠ°ΠΊ Π² ΡΠ»ΡΡΠ°Π΅ grepMP, ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΊΠ°ΠΊ Π² ΡΠ»ΡΡΠ°Π΅ grepMT, ΡΠΏΠΎΡΠΎΠ±Π΅Π½ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡ ΠΊ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π»ΠΈΡΡ Π² ΡΠ»ΡΡΠ°Π΅ SMP-ΡΠΈΡΡΠ΅ΠΌ. ΠΡΠΈΠ³ΡΡΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π΄ΠΈΡΠΊΠΎΠ², Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈ Π»ΡΠ±ΠΎΠΌ Π΄ΡΡΠ³ΠΎΠΌ ΡΠ°ΡΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈΠ²Π°Π½ΠΈΠΈ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ. ΠΠΎ Π²ΡΠ΅Ρ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΡΠ»ΡΡΠ°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π° Ρ ΡΡΠ°ΡΡΠΈΠ΅ΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π±ΡΠ΄ΡΡ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡΡΡ Π² ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅.