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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QNX/UNIX: Анатомия ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 38

Автор Π¦ΠΈΠ»ΡŽΡ€ΠΈΠΊ ОлСг Π˜Π²Π°Π½ΠΎΠ²ΠΈΡ‡

Β  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

Β  // Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎ уровня Ρ‚ΠΎΠ³ΠΎ,

Β  // ΠΊΡ‚ΠΎ Π΅Π΅ устанавливал, вызывая конструктор

<b>Β Β pthread_attr_setinheritsched(&amp;attr, PTHREAD_EXPLICIT_SCHED);</b>

<b>Β  pthread_attr_setschedparam(&amp;attr, &amp;p-&gt;param);</b>

Β  // запуск Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ &quot;отсоСдинСнном&quot; ΠΏΠΎΡ‚ΠΎΠΊΠ΅

Β  pthread_create(NULL, &amp;attr, p-&gt;func, NULL);

Β  if (p-&gt;statistic()) ++p-&gt;sync;

Β }

}

// 'пустой' ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала SIGINT (рСакция Π½Π° ^Π‘)

inline static void empty(int signo) {}

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

Β // с этой Ρ‚ΠΎΡ‡ΠΊΠΈ стандартная рСакция Π½Π° ^Π‘ отмСняСтся...

Β signal(SIGINT, empty);

Β // массив Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

Β void(*funcs[])(void) = { &amp;mon1, &amp;mon2, &amp;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 &lt; num; i++) {

Β  tb[i] = new thrblock(funcs[i], period[i],

Β  priority[i], true);

Β  if (!tb[i]-&gt;OK())

Β  perror(&quot;synchro thread create&quot;), exit(EXIT_FAILURE);

Β }

Β // ... Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ ^Π‘.

Β pause();

Β // подсчСт статистики ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

Β cout &lt;&lt; endl &lt;&lt; &quot;Monitoring finalisation!&quot; &lt;&lt; endl;

Β // Π²Ρ‹Π²ΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΠ² Π±ΡƒΠ΄Π΅ΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ Π² миллисСкундах:

Β const double n2m = 1000000.;

Β for (int i = 0; i &lt; num, i++) {

Β  timestat *p = &amp;tb[i]-&gt;sync;

Β  !(*p); // подсчСт статистики ΠΏΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ

Β  cout &lt;&lt; i &lt;&lt; '\t' &lt;&lt; p-&gt;num &lt;&lt; &quot;\t=&gt; &quot; &lt;&lt; p-&gt;mean / n2m &lt;&lt; &quot; [&quot; &lt;&lt;

Β Β  p-&gt;tmin / n2m &lt;&lt; &quot;...&quot; &lt;&lt; p-&gt;tmax / n2m &lt;&lt; &quot;]\t~&quot; &lt;&lt; p-&gt;disp / n2m &lt;&lt;

Β  Β &quot; (&quot; &lt;&lt; p-&gt;disp / p-&gt;mean * 100 &lt;&lt; &quot;%)&quot; &lt;&lt; endl;

Β }

Β return EXIT_SUCCESS;

}

Вся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ сосрСдоточСна Π² ΠΎΠ΄Π½ΠΎΠΌ классС β€”

thrblock
, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π² Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. НСобычной ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° этого класса являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Π² Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ΅ Β«Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²Β», навСянной повСрхностным знакомством с языками программирования ΡˆΠΊΠΎΠ»Ρ‹ Н. Π’ΠΈΡ€Ρ‚Π° β€” ActiveOberon ΠΈ Zormon. Π’ Π½Π΅ΠΉ говорится, Ρ‡Ρ‚ΠΎ конструктор Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ создаСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄Π°Π½Π½Ρ‹Ρ…, Π½ΠΎ ΠΈ запускаСт (ΠΊΠ°ΠΊ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚) ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ выполнСния для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ создаваСмого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π’ нашСм случаС Π·Π°Π΄Π°Ρ‡Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ состоит Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, адрСс ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±Ρ‹Π» ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ конструктору ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² качСствС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². [26]

НиТС прСдставлСны отличия нашСй Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΡ‚ простого Ρ†ΠΈΠΊΠ»Π° с Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ, ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π²ΡˆΠ΅ΠΉΡΡ Π²Ρ‹ΡˆΠ΅ (ΠΏΠΎΠΌΠΈΠΌΠΎ исправлСний ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Ρ… нСдостатков):

β€’ Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° установлСн свой ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ «пробуТдСния», ΠΈ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ достаточно высоким, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ вытСснСниС этого ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

β€’ ПослС «пробуТдСния» ΠΏΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρƒ запускаСтся цСлСвая функция, Π½ΠΎ выполняСтся это ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ «отсоСдинСнным». Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, процСсс выполнСния Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ влияСт Π½Π° ΠΎΠ±Ρ‰ΡƒΡŽ схСму синхронизации.

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

Запустим нашС тСстовоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:

# 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Β  =&gt; 316.919 [316.867...317.895] ~0.178511 (0.056327%)

1 59 Β =&gt; 170.955 [168.583...173.296] ~0.92472 (0.540914%)

2 132 =&gt; 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 =&gt; 316.919 [316.797...317.915] ~0.185331 (0.0584792%)