Β pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
Β // Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄ΠΎ ΡΡΠΎΠ²Π½Ρ ΡΠΎΠ³ΠΎ,
Β // ΠΊΡΠΎ Π΅Π΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π», Π²ΡΠ·ΡΠ²Π°Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ
<b>Β Β pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);</b>
<b>Β pthread_attr_setschedparam(&attr, &p->param);</b>
Β // Π·Π°ΠΏΡΡΠΊ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ "ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΠΎΠΌ" ΠΏΠΎΡΠΎΠΊΠ΅
Β pthread_create(NULL, &attr, p->func, NULL);
Β if (p->statistic()) ++p->sync;
Β }
}
// 'ΠΏΡΡΡΠΎΠΉ' ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° SIGINT (ΡΠ΅Π°ΠΊΡΠΈΡ Π½Π° ^Π‘)
inline static void empty(int signo) {}
int main(int argc, char **argv) {
Β // Ρ ΡΡΠΎΠΉ ΡΠΎΡΠΊΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ ΡΠ΅Π°ΠΊΡΠΈΡ Π½Π° ^Π‘ ΠΎΡΠΌΠ΅Π½ΡΠ΅ΡΡΡ...
Β signal(SIGINT, empty);
Β // ΠΌΠ°ΡΡΠΈΠ² ΡΠ΅Π»Π΅Π²ΡΡ
ΡΡΠ½ΠΊΡΠΈΠΉ
Β void(*funcs[])(void) = { &mon1, &mon2, &mon3 };
Β // ΠΏΠ΅ΡΠΈΠΎΠ΄Ρ ΠΈΡ
ΡΠΈΠ½Ρ
ΡΠΎΡΠ΅ΡΠΈΠΉ Π·Π°ΠΏΡΡΠΊΠ°
Β int period[] = { 317, 171, 77 };
Β // ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΡ, Π½Π° ΠΊΠΎΡΠΎΡΡΡ
ΠΎΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ ΡΠ΅Π°ΠΊΡΠΈΡ
Β // ΡΠΈΠ½Ρ
ΡΠΎΡΠ΅ΡΠΈΠΉ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΡΠ°ΠΉΠΌΠ΅ΡΠΎΠ² ΡΠΈΠ½Ρ
ΡΠΎΡΠ΅ΡΠΈΠΉ
Β int priority[] = { 15, 5, 25 };
Β int num = sizeof(funcs) / sizeof(*funcs);
Β // Π·Π°ΠΏΡΡΠΊ 3-Ρ
ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠ΅ΠΉ
Β // Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ (ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²)
Β thrblock** tb = new (thrblock*)[num];
Β for (int i = 0; i < num; i++) {
Β tb[i] = new thrblock(funcs[i], period[i],
Β priority[i], true);
Β if (!tb[i]->OK())
Β perror("synchro thread create"), exit(EXIT_FAILURE);
Β }
Β // ... Π° ΡΠ΅ΠΏΠ΅ΡΡ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ ^Π‘.
Β pause();
Β // ΠΏΠΎΠ΄ΡΡΠ΅Ρ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ ΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ
Β cout << endl << "Monitoring finalisation!" << endl;
Β // Π²ΡΠ²ΠΎΠ΄ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΎΠ² Π±ΡΠ΄Π΅ΠΌ Π΄Π΅Π»Π°ΡΡ Π² ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π°Ρ
:
Β const double n2m = 1000000.;
Β for (int i = 0; i < num, i++) {
Β timestat *p = &tb[i]->sync;
Β !(*p); // ΠΏΠΎΠ΄ΡΡΠ΅Ρ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ ΠΏΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΡ
Β cout << i << '\t' << p->num << "\t=> " << p->mean / n2m << " [" <<
Β Β p->tmin / n2m << "..." << p->tmax / n2m << "]\t~" << p->disp / n2m <<
Β Β " (" << p->disp / p->mean * 100 << "%)" << endl;
Β }
Β return EXIT_SUCCESS;
}ΠΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠΎΡΡΠ΅Π΄ΠΎΡΠΎΡΠ΅Π½Π° Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅ β
thrblockΠΠΈΠΆΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ ΠΎΡΠ»ΠΈΡΠΈΡ Π½Π°ΡΠ΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΡ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π° Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠΎΠΉ, ΠΎΠ±ΡΡΠΆΠ΄Π°Π²ΡΠ΅ΠΉΡΡ Π²ΡΡΠ΅ (ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΉ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΡ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠΎΠ²):
β’ ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΡΡΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠΌΠ΅ΡΠ° ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ ΡΠ²ΠΎΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ Β«ΠΏΡΠΎΠ±ΡΠΆΠ΄Π΅Π½ΠΈΡΒ», ΠΈ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π²ΡΡΠΎΠΊΠΈΠΌ, Π΄Π»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ Π²ΡΡΠ΅ΡΠ½Π΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΡΡΡΠ΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°.
β’ ΠΠΎΡΠ»Π΅ Β«ΠΏΡΠΎΠ±ΡΠΆΠ΄Π΅Π½ΠΈΡΒ» ΠΏΠΎ ΡΠ°ΠΉΠΌΠ΅ΡΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΡΠ΅Π»Π΅Π²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, Π½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΡΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ, ΠΏΡΠΈΡΠ΅ΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ Β«ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠΌΒ». ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΠΏΡΠΎΡΠ΅ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Π²Π»ΠΈΡΠ΅Ρ Π½Π° ΠΎΠ±ΡΡΡ ΡΡ Π΅ΠΌΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ.
β’ ΠΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΡΡΠΊΠΎΠΌ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠ΅ΠΌΡ Π΅Π΅ ΠΏΠΎΡΠΎΠΊΡ Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ ΠΏΠΎΡΠΎΠ΄ΠΈΠ²ΡΠ΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° (Π½ΠΎ Π½Π΅ ΠΏΠΎΡΠΎΠΊΠ° ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠΌΠ΅ΡΠ°!), Π²Π΅Π΄Ρ Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ΅Π»Π΅Π²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΡΠ΅ΠΌ Π±ΠΎΠ»Π΅Π΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π½Π΅ ΠΎΡΠ΅Π½Ρ Π·Π½Π°ΡΠΈΠΌΠ°Ρ, ΠΊΠ°ΠΊ Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅, ΠΌΠΎΠ³Π»Π° Π²Π»ΠΈΡΡΡ Π²ΡΡΠ΅ΡΠ½Π΅Π½ΠΈΠ΅ΠΌ Π½Π° ΠΏΡΠΎΡΠ΅ΡΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ.
ΠΠ°ΠΏΡΡΡΠΈΠΌ Π½Π°ΡΠ΅ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:
# t3
+10+10*10+10+10.10*10+10+10*10+10+10.10*10+10+10+10*10+10.10+10*10+10+10*10+10.10+10*10+10+10*10+10.10+10+10*10+10+10+10.10+10+10*10+10+10.10*10+10+10+10*10+10.10+10*10+10+10*10+10+10.10*10+10+10*10+10+10.10+10*10+10+10*10+10.10+10*10+10+10*10+10.10+10+10*10+10+10*10^C
Monitoring finalisation!
0 32Β => 316.919 [316.867...317.895] ~0.178511 (0.056327%)
1 59 Β => 170.955 [168.583...173.296] ~0.92472 (0.540914%)
2 132 => 76.9796 [76.942...77.9524]Β ~0.085977 (0.111688%)ΠΠ΅ΡΠ²ΠΎΠ΅, ΡΡΠΎ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, β ΡΡΠΎ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΈΠ»ΠΈΡΠ½ΡΡ ΡΠΎΡΠ½ΠΎΡΡΡ Π²ΡΠ΄Π΅ΡΠΆΠΊΠΈ ΠΏΠ΅ΡΠΈΠΎΠ΄Π° ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ (ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° Π²ΡΠ²ΠΎΠ΄Π°). ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΠ΅Π»Π΅Π²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈ ΡΡΠΎΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠΌ ΠΏΠΎΡΠΎΠ΄ΠΈΠ²ΡΠ΅Π³ΠΎ Π΅Π΅ ΠΏΠΎΡΠΎΠΊΠ°, Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΡΠ΅ΠΌ ΡΡΡΠΎΠΊΠΈ, Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΠΆΠΈΡΠ½ΡΠΌ ΡΡΠΈΡΡΠΎΠΌ Π² ΠΊΠΎΠ΄Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ:
# t3
+25+25*5+25+25.15*5+25+25*5+25+25.15*5+25+25+25*5+25.15+25*5+25+25*5+25.15+25*5+25+25*5*5+25.15+25+25*5+25+25*5.15+25+25*5+25+25.15*5+25+25+25*5+25.15+25*5+25+25*5+25+25.15*5+25+25*5+25+25^C
Monitoring finalisation!
0 32 => 316.919 [316.797...317.915] ~0.185331 (0.0584792%)