ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠ² Ρ ΠΎΡΠΎΡΠΎ ΡΠ°ΠΌ, Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΡΡΠ΄Π΅ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ Π·Π°Π΄Π°Ρ (Π³ΡΠ°ΡΠΈΠΊΠ°, ΡΠΈΡΡΠΎΠ²Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠΈΠ³Π½Π°Π»ΠΎΠ², ΠΈ Ρ.Π΄.). ΠΠΎΡΠΎΠΊΠΈ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½Ρ ΡΠ°ΠΌ, Π³Π΄Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΡ ΠΎΠ±ΡΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅ β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ. ΠΡΠΈ Π΄Π²Π° ΠΊΠ»Π°ΡΡΠ° Π·Π°Π΄Π°Ρ ΠΌΡ Π·Π΄Π΅ΡΡ ΠΈ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ.
ΠΠΎΡΠΎΠΊΠΈ Π² ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ ΠΌΡ ΠΈΠΌΠ΅Π΅ΠΌ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠΈ Π»ΡΡΠ°. ΠΠ°ΠΆΠ΄Π°Ρ ΡΡΡΠΎΠΊΠ° ΡΠ°ΡΡΡΠ° Π½Π° ΡΠΊΡΠ°Π½Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ (ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌΡΡ ΠΊΠ°ΡΡΠΈΠ½ΠΊΡ). ΠΠ»ΡΡΠ΅Π²ΡΠΌ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠΌ Π·Π΄Π΅ΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄Π°Ρ ΡΡΡΠΎΠΊΠ° ΡΠ°ΡΡΡΠ° Π½Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ . ΠΡΠΎ ΠΎΠ±ΡΡΠΎΡΡΠ΅Π»ΡΡΡΠ²ΠΎ (Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΡΡΡΠΎΠΊ ΡΠ°ΡΡΡΠ°) Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½ΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ ΠΊΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΉ.
ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΠΎΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ:
int main (int argc, char **argv) {
int x1;
... // ΠΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ
for (x1 = 0; x1 < num_x_lines; x1++) {
do_one_line(x1);
}
... // ΠΡΠ²Π΅ΡΡΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ
}
ΠΠ΄Π΅ΡΡ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΡΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎ ΠΏΠΎ Π²ΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌ ΡΠ°ΡΡΡΠΈΡΠ°Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΡΠ°ΡΡΡΠΎΠ²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ.
Π ΠΌΠ½ΠΎΠ³ΠΎΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ ΡΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠ². ΠΠΎΡΠ΅ΠΌΡ? ΠΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΡ Π½Π΅ ΡΠΊΠ°Π·Π°Π»ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΡΠΎ-Π»ΠΈΠ±ΠΎ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ. ΠΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° Π½Π΅ Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ ΡΠΌΠ½Π°, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ ΡΠΊΠ°Π·Π°ΡΡ: Β«ΠΠΉ, ΡΠ΅ΠΊΡΠ½Π΄ΠΎΡΠΊΡ! Π£ Π½Π°Ρ Π΅Π΅ 4 ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°, ΠΈ ΠΏΠΎΡ ΠΎΠΆΠ΅, ΡΡΠΎ Ρ Π½Π°Ρ ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ. ΠΠ°ΠΏΡΡΡ-ΠΊΠ° Ρ ΡΡΠΎ Π½Π° Π²ΡΠ΅Ρ 4 ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°Ρ ΡΡΠ°Π·Ρ!Β»
Π’Π°ΠΊ ΡΡΠΎ ΡΡΠΎ Π΄Π΅Π»ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° (Π²Π°ΡΠ΅ Π΄Π΅Π»ΠΎ!) β ΡΠΎΠΎΠ±ΡΠΈΡΡ QNX/Neutrino, ΠΊΠ°ΠΊΠΈΠ΅ ΡΠ°Π·Π΄Π΅Π»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ. ΠΡΠΎΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊ:
int main (int argc, char **argv) {
int x1;
... // ΠΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ
for (x1 = 0; x1 < num_x_lines; x1++) {
pthread_create(NULL, NULL, do_one_line, (void*)x1);
}
... // ΠΡΠ²Π΅ΡΡΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ
}
Π‘ ΡΠ°ΠΊΠΈΠΌ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠ²ΡΠ·Π°Π½ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌ. ΠΠ΅ΡΠ²Π°Ρ ΠΈΠ· Π½ΠΈΡ (ΠΈ ΡΠ°ΠΌΠ°Ρ Π½Π΅Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½Π°Ρ) ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ do_one_line() ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΎΠ½Π° ΠΌΠΎΠ³Π»Π° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ²ΠΎΠ΅Π³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° void* Π²ΠΌΠ΅ΡΡΠΎ int. ΠΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ ΡΠΈΠΏΠ° (typecast).
ΠΡΠΎΡΠ°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ»ΠΎΠΆΠ½Π΅Π΅. Π‘ΠΊΠ°ΠΆΠ΅ΠΌ, ΡΡΠΎ ΡΠ°Π·ΡΠ΅ΡΠ°ΡΡΠ°Ρ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ Π΄ΠΈΡΠΏΠ»Π΅Ρ, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ Π²Ρ ΡΠ°ΡΡΡΠΈΡΡΠ²Π°Π»ΠΈ ΠΊΠ°ΡΡΠΈΠ½ΠΊΡ, Π±ΡΠ»Π° ΡΠ°Π²Π½Π° 1280Γ1024. ΠΠ°ΠΌ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π±Ρ ΡΠΎΠ·Π΄Π°ΡΡ 1280 ΠΏΠΎΡΠΎΠΊΠΎΠ²! Π ΠΎΠ±ΡΠ΅ΠΌ-ΡΠΎ, Π΄Π»Ρ QNX/Neutrino ΡΡΠΎ Π½Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° β QNX/Neutrino ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π΄ΠΎ 32767 ΠΏΠΎΡΠΎΠΊΠΎΠ² Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ΅! ΠΠ΄Π½Π°ΠΊΠΎ, ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ ΡΠ²ΠΎΠΉ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΡΠ΅ΠΊ. ΠΡΠ»ΠΈ Π²Π°Ρ ΡΡΠ΅ΠΊ ΠΈΠΌΠ΅Π΅Ρ ΡΠ°Π·ΡΠΌΠ½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ (ΡΠΊΠ°ΠΆΠ΅ΠΌ 8 ΠΠ±), ΡΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΠ·ΡΠ°ΡΡ ΠΎΠ΄ΡΠ΅Ρ ΠΏΠΎΠ΄ ΡΡΠ΅ΠΊ 1280Γ8 ΠΠ± (10 ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ!) ΠΠΠ£. Π ΡΠ°Π΄ΠΈ ΡΠ΅Π³ΠΎ? Π Π²Π°ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ 4 ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΡΠΎΠ»ΡΠΊΠΎ 4 ΠΈΠ· ΡΡΠΈΡ 1280 ΠΏΠΎΡΠΎΠΊΠΎΠ² Π±ΡΠ΄ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ, Π° Π΄ΡΡΠ³ΠΈΠ΅ 1276 ΠΏΠΎΡΠΎΠΊΠΎΠ² Π±ΡΠ΄ΡΡ ΠΎΠΆΠΈΠ΄Π°ΡΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΡ. (Π Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΏΠΎΠ΄ ΡΡΠ΅ΠΊ Π±ΡΠ΄Π΅Ρ Π²ΡΠ΄Π΅Π»ΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎ ΠΌΠ΅ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ. ΠΠΎ ΡΠ΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΡΡΠΎ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ ΡΠ°ΡΡ ΠΎΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΡΡΡΡΠΎΠ² Π²ΠΏΡΡΡΡΡ β Π΅ΡΡΡ Π²Π΅Π΄Ρ Π΅ΡΠ΅ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΈΠ·Π΄Π΅ΡΠΆΠΊΠΈ.)
ΠΠΎΠ»Π΅Π΅ ΠΊΡΠ°ΡΠΈΠ²ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ Π±ΡΠ»ΠΎ Π±Ρ ΡΠ°Π·Π±ΠΈΡΡ Π΅Π΅ Π½Π° 4 ΡΠ°ΡΡΠΈ (ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΠ΄Π·Π°Π΄Π°ΡΠ΅ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ), ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΊΠ°ΠΆΠ΄ΡΡ ΡΠ°ΡΡΡ ΠΊΠ°ΠΊ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΏΠΎΡΠΎΠΊ:
int num_lines_per_cpu;
int num_cpus;
int main (int argc, char **argv) {
int cpu;
... // ΠΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ
// ΠΠΎΠ»ΡΡΠΈΡΡ ΡΠΈΡΠ»ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠ²
num_cpus = _syspage_ptr->num_cpu;
num_lines_per_cpu = num_x_lines / num_cpus;
for (cpu = 0; cpu < num_cpus; cpu++) {
pthread_create(NULL, NULL, do_one_batch, (void*)cpu);
}
... // ΠΡΠ²Π΅ΡΡΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ
}
void* do_one_batch(void *c) {
int cpu = (int)c;
int x1;
for (x1 = 0; x1 < num_lines_per_cpu; x1++) {
do_line_line(x1 + cpu * num_lines_per_cpu);
}
}
ΠΠ΄Π΅ΡΡ ΠΌΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ num_cpus ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π½Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ΅. Π ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠΌ ΡΠΈΡΠ»ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΌΡ ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ Π½Π΅ Π·Π°ΡΠΎΡΡΠ΅ΠΌ ΠΏΠ°ΠΌΡΡΡ Π½Π΅Π½ΡΠΆΠ½ΡΠΌΠΈ ΡΡΠ΅ΠΊΠ°ΠΌΠΈ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΡΠΈΡΠ»ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠ² ΠΏΡΡΠ΅ΠΌ ΡΠ°Π·ΡΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ β ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ _syspage_ptr. (ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π² ΠΊΠ½ΠΈΠ³Π΅ Β«Building Embedded SystemsΒ» (ΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΏΠΎ QNX/ Neutrino β ΠΏΡΠΈΠΌ. ΡΠ΅Π΄.) ΠΈΠ»ΠΈ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ <sys/syspage.h>).
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠ²ΠΠΎΡΠ»Π΅Π΄Π½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π° ΡΠ΅ΠΌ, ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°ΡΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ Ρ ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠΌ ΡΠΎΠΆΠ΅. ΠΡΠΎΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡ Π²ΡΡ ΡΠ°Π±ΠΎΡΡ. ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΈΠ·Π΄Π΅ΡΠΆΠΊΠΈ (ΠΎΠ΄ΠΈΠ½ ΡΡΠ΅ΠΊ) Ρ Π»ΠΈΡ Π²ΠΎΠΉ ΠΎΠΊΡΠΏΠ°ΡΡΡΡ Π³ΠΈΠ±ΠΊΠΎΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΠΌΠ΅ΡΡΠ΅ΠΉ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π±ΡΡΡΡΠ΅Π΅ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅.
Π‘ΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ ΠΌΠΎΠΌΠ΅Π½ΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°Π― ΡΠΆΠ΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π», ΡΡΠΎ Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΌ Π²ΡΡΠ΅ ΡΠΏΡΠΎΡΠ΅Π½Π½ΡΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠ²ΡΠ·Π°Π½Π° ΠΌΠ°ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌ. Π’Π°ΠΊ Π²ΠΎΡ, Π΅ΡΠ΅ ΠΎΠ΄Π½Π° ΡΠ²ΡΠ·Π°Π½Π½Π°Ρ Ρ Π½ΠΈΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ main() ΡΠ½Π°ΡΠ°Π»Π° Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΡΠ΅Π»ΡΠΉ Π±ΡΠΊΠ΅Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ², Π° Π·Π°ΡΠ΅ΠΌ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ. ΠΠΎ ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΡ ΡΠ·Π½Π°Π΅Ρ, ΠΊΠΎΠ³Π΄Π° ΡΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ?
ΠΠ°ΡΡΠ°Π²Π»ΡΡΡ main() Π·Π°Π½ΠΈΠΌΠ°ΡΡΡΡ ΠΎΠΏΡΠΎΡΠΎΠΌ, Π·Π°ΠΊΠΎΠ½ΡΠ΅Π½Ρ Π»ΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ, ΠΏΡΠΎΡΠΈΠ²ΠΎΡΠ΅ΡΠΈΡ ΡΠ°ΠΌΠΎΠΌΡ Π·Π°ΠΌΡΡΠ»Ρ ΠΠ‘ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
int main (int argc, char **argv) {
...
// ΠΠ°ΠΏΡΡΡΠΈΡΡ ΠΏΠΎΡΠΎΠΊΠΈ, ΠΊΠ°ΠΊ ΡΠ°Π½ΡΡΠ΅
while (num_lines_completed < num_x_lines) {
sleep(1);
}
}
He Π²Π·Π΄ΡΠΌΠ°ΠΉΡΠ΅ ΠΏΠΈΡΠ°ΡΡ ΡΠ°ΠΊΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ!
ΠΠ»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ Π΄Π²Π° ΠΈΠ·ΡΡΠ½ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΡ: ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ pthread_join() ΠΈ barrier_wait().
Β«ΠΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅Β» (joining)Π‘Π°ΠΌΡΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ β ΡΡΠΎ Β«ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅Β» ΠΏΠΎΡΠΎΠΊΠΎΠ². Π Π΅Π°Π»ΡΠ½ΠΎ ΡΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ.
ΠΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ, ΠΆΠ΄ΡΡΠΈΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°. ΠΠ΄ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ Π²ΡΠ·ΡΠ²Π°Π΅Ρ pthread_join():
#include <pthread.h>
int pthread_join(pthread_t thread, void **value_ptr);
Π€ΡΠ½ΠΊΡΠΈΠΈ pthread_join() ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΠΎΡΠΎΠΊΠ°, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π²Ρ ΠΆΠ΅Π»Π°Π΅ΡΠ΅ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡΡΡ, Π° ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ value_ptr, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ Π΄Π»Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡ (ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° NULL, Π΅ΡΠ»ΠΈ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π²Π°Ρ Π½Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ° β Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ ΡΠ°ΠΊ ΠΈ ΡΠ΄Π΅Π»Π°Π΅ΠΌ).
ΠΠ΄Π΅ Π½Π°ΠΌ Π±ΡΠ°ΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΠΎΡΠΎΠΊΠ°? ΠΡ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°Π»ΠΈ Π΅Π³ΠΎ Π² ΡΡΠ½ΠΊΡΠΈΠΈ pthread_create(), ΠΏΠ΅ΡΠ΅Π΄Π°Π² NULL Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΈΡΠΏΡΠ°Π²ΠΈΠΌ Π½Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ:
int num_lines_per_cpu;
int num_cpus;
int main(int argc, char **argv) {
int cpu;
pthread_t *thread_ids;
... // ΠΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ
thread_ids = malloc(sizeof(pthread_t) * num_cpus);
num_lines_per_cpu = num_x_lines / num_cpus;
for (cpu = 0; cpu < num_cpus; cpu++) {
pthread_create(
&thread_ids[cpu], NULL, do_one_batch, (void*)cpu);
}
// Π‘ΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡΡΡ Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ΠΌ Π²ΡΠ΅Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ²
for (cpu = 0; cpu < num_cpus; cpu++) {
pthread_join(thread_ids[cpu], NULL);
}
... // ΠΡΠ²Π΅ΡΡΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ
}
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π½Π° ΡΡΠΎΡ ΡΠ°Π· ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π»ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_create() Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° pthread_t. Π’Π°ΠΌ ΠΈ Π±ΡΠ΄Π΅Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π²Π½ΠΎΠ²Ρ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°. ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΈΠΊΠ» for Π·Π°Π²Π΅ΡΡΠΈΡΡΡ, Ρ Π½Π°Ρ Π±ΡΠ΄Π΅Ρ num_cpu ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΏΠ»ΡΡ ΠΏΠΎΡΠΎΠΊ, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΠΉ main(). ΠΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° ΠΏΠΎΡΠΎΠΊΠΎΠΌ main() Π½Π°Ρ ΠΌΠ°Π»ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅Ρ β ΡΡΠΎΡ ΠΏΠΎΡΠΎΠΊ ΠΏΠΎΡΡΠ°ΡΠΈΡ Π²ΡΠ΅ ΡΠ²ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π½Π° ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅.
ΠΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π΄ΠΎΡΡΠΈΠ³Π°Π΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_join() ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΠΈΠ· Π½Π°ΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ². Π‘Π½Π°ΡΠ°Π»Π° ΠΌΡ ΠΆΠ΄Π΅ΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ° thread_ids[0]. ΠΠΎΠ³Π΄Π° ΠΎΠ½ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ, ΡΡΠ½ΠΊΡΠΈΡ pthread_join() ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ. Π‘Π»Π΅Π΄ΡΡΡΠ°Ρ ΠΈΡΠ΅ΡΠ°ΡΠΈΡ ΡΠΈΠΊΠ»Π° for Π·Π°ΡΡΠ°Π²ΠΈΡ Π½Π°Ρ ΠΆΠ΄Π°ΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ° thread_ids[1], ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅ Π΄Π»Ρ Π²ΡΠ΅Ρ num_cpus ΠΏΠΎΡΠΎΠΊΠΎΠ².
Π ΡΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π·Π°ΠΊΠΎΠ½Π½ΡΠΉ Π²ΠΎΠΏΡΠΎΡ: Β«Π ΡΡΠΎ Π΅ΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΊΠΈ Π·Π°Π²Π΅ΡΡΠ°Ρ ΡΠ°Π±ΠΎΡΡ Π² ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅?Β» ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, Π΅ΡΠ»ΠΈ ΠΈΠΌΠ΅ΡΡΡΡ 4 ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°, ΠΈ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏΡΠΈΡΠΈΠ½Π΅ ΠΏΠΎΡΠΎΠΊ, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΠΉΡΡ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ΅ (Ρ Π½ΠΎΠΌΠ΅ΡΠΎΠΌ 3), Π·Π°Π²Π΅ΡΡΠΈΡ ΡΠ°Π±ΠΎΡΡ ΠΏΠ΅ΡΠ²ΡΠΌ, Π·Π°ΡΠ΅ΠΌ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ ΠΏΠΎΡΠΎΠΊ, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΠΉΡΡ Π½Π° ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ΅ Ρ Π½ΠΎΠΌΠ΅ΡΠΎΠΌ 2, ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅? ΠΡΡ ΠΏΡΠ΅Π»Π΅ΡΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ΡΡ Π΅ΠΌΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π½ΠΈΡΠ΅Π³ΠΎ ΠΏΠ»ΠΎΡ ΠΎΠ³ΠΎ Π½Π΅ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ.