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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² срСдС WindowsΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 84

Автор ДТонсон Π₯Π°Ρ€Ρ‚

 r2cq_array = calloc(nthread, sizeof(queue_t));

 for (ithread = 0; ithread < nthread; ithread++) {

  /* Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ r2с для ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄Π°Π½Π½ΠΎΠ³ΠΎ потрСбитСля. */

  q_initialize(&r2cq_array[ithread], sizeof(msg_block_t), R2C_QLEN);

  /* Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠ°. */

  consumer_arg[ithread].thread_number = ithread;

  consumer_arg[ithread].work_goal = goal;

  consumer_arg[ithread].work_done = 0;

  consumer_th[ithread] = (HANDLE)_beginthreadex(NULL, 0, consumer, (PVOID)&consumer_arg[ithread], 0, &thid);

  producer_arg[ithread].thread_number = ithread;

  producer_arg[ithread].work_goal = goal;

  producer_arg[ithread].work_done = 0;

  producer_th[ithread] = (HANDLE)_beginthreadex(NULL, 0, producer, (PVOID)&producer_arg[ithread], 0, &thid);

 }

 transraitter_th = (HANDLE)_beginthreadex(NULL, 0, transmitter, NULL, 0, &thid);

 receiver_th = (HANDLE)_beginthreadex (NULL, 0, receiver, NULL, 0, &thid);

 _tprintf(_T("Π₯ΠžΠ—Π―Π˜Π: Π’Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ\n"));

 /* Π–Π΄Π°Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² производитСля. */

 for (ithread = 0; ithread < nthread; ithread++) {

  WaitForSingleObject(producer_th[ithread], INFINITE);

  _tprintf(_T("Π₯ΠžΠ—Π―Π˜Π: ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ %d Π²Ρ‹Ρ€Π°Π±ΠΎΡ‚Π°Π» %d Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹Ρ… сообщСний\n"), ithread, producer_arg[ithread].work_done);

 }

 /* ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρƒ. */

 _tprintf(_T("Π₯ΠžΠ—Π―Π˜Π: ВсС ΠΏΠΎΡ‚ΠΎΠΊΠΈ производитСля Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ.\n"));

 /* Π–Π΄Π°Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² потрСбитСля. */

 for (ithread = 0; ithread < nthread; ithread++) {

  WaitForSingleObject(consumer_th[ithread], INFINITE);

  _tprintf(_T("Π₯ΠžΠ—Π―Π˜Π: ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ %d принял %d ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Ρ… сообщСний\n"), ithread, consumer_arg[ithread].work_done);

 }

 _tprintf(_T("Π₯ΠžΠ—Π―Π˜Π: ВсС ΠΏΠΎΡ‚ΠΎΠΊΠΈ потрСбитСля Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ.\n"));

 ShutDown = 1; /* Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹. */

 /* Π—Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² состояниС оТидания ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰ΠΈΡ… ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². */

 /* Π­Ρ‚Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰ΠΈΠΉ,*/

 /* ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½Π΅ Π²Π»Π°Π΄Π΅ΡŽΡ‚ ΠΈΠ½Ρ‹ΠΌΠΈ рСсурсами, ΠΊΡ€ΠΎΠΌΠ΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, */

 /* ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΠΎΠΊΠΈΠ½ΡƒΡ‚ΡŒ ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ выполнСния, Π½Π΅ уступив ΠΏΡ€Π°Π² владСния ΠΈΠΌΠΈ. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ? */ 

 TerminateThread(transmitter_th, 0);

 TerminateThread(receiver_th, 0);

 WaitForSingleObject(transmitter_th, INFINITE);

 WaitForSingleObject(receiver_th, INFINITE);

 q_destroy(&p2tq);

 q_destroy(&t2rq);

 for (ithread = 0; ithread < nthread; ithread++) q_destroy(&r2cq_array [ithread]);

 free(r2cq_array);

 free(producer_th);

 free(consumer_th);

 free(producer_arg);

 free(consumer_arg);

 _tprintf(_T("БистСма Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ. ΠžΡΡ‚Π°Π½ΠΎΠ² систСмы\n"));

 return 0;

}


DWORD WINAPI producer(PVOID arg) {

 THARG * parg;

 DWORD ithread, tstatus;

 msg_block_t msg;

 parg = (THARG *)arg;

 ithread = parg->thread_number;

 while (parg->work_done < parg->work_goal) {

  /* Π’Ρ‹Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹Π΅ сообщСния, ΠΏΠΎΠΊΠ° ΠΈΡ… ΠΎΠ±Ρ‰Π΅Π΅ количСство */

  /* Π½Π΅ станСт Ρ€Π°Π²Π½Ρ‹ΠΌ "goal". */

  /* БообщСния ΡΠ½Π°Π±ΠΆΠ°ΡŽΡ‚ΡΡ адрСсами отправитСля ΠΈ адрСсата, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² */

  /* нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ для всСх сообщСний, Π½ΠΎ Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС */

  /* ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ. */

  delay_cpu(DELAY_COUNT * rand() / RAND_MAX);

  message_fill(&msg, ithread, ithread, parg->work_done);

  /* ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ сообщСниС Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. */

  tstatus = q_put(&p2tq, &msg, sizeof(msg), INFINITE);

  parg->work_done++;

 }

 return 0;

}


DWORD WINAPI transmitter(PVOID arg) {

 /* ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡΡŒ нСсколько сообщСний ΠΎΡ‚ производитСля, объСдиняя ΠΈΡ… Π² ΠΎΠ΄Π½ΠΎ*/

 /* составноС сообщСниС, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ для ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. */

 DWORD tstatus, im;

 t2r_msg_t t2r_msg = {0};

 msg_block_t p2t_msg;

 while (!ShutDown) {

  t2r_msg.num_msgs = 0;

  /* Π£ΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ сообщСния для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ. */

  for (im = 0; im < TBLOCK_SIZE; im++) {

   tstatus = q_get(&p2tq, &p2t_msg, sizeof(p2t_msg), INFINITE); 

   if (tstatus != 0) break;

   memcpy(&t2r_msg.messages[im], &p2t_msg, sizeof(p2t_msg));

   t2r_rasg.num_msgs++;

  }

  tstatus = q_put(&t2rq, &t2r_msg, sizeof(t2r_msg), INFINITE);

  if (tstatus != 0) return tstatus;

 }

 return 0;

}


DWORD WINAPI receiver(PVOID arg) {

 /* ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ составныС сообщСния ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°; Ρ€Π°ΡΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ */

 /* ΠΈΡ… ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŽ. */

 DWORD tstatus, im, ic;

 t2r_msg_t t2r_msg;

 msg_block_t r2c_msg;

 while (!ShutDown) {

  tstatus = q_get(&t2rq, &t2r_msg, sizeof(t2r_msg), INFINITE);

  if (tstatus != 0) return tstatus;

  /* Π Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ сообщСния ΠΌΠ΅ΠΆΠ΄Ρƒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ потрСбитСлями. */

  for (im = 0; im < t2r_msg.num_msgs; im++) {

   memcpy(&r2c_msg, &t2r_msg.messages[im], sizeof(r2c_msg));

   ic = r2c_msg.destination; /* ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ. */

   tstatus = q_put(&r2cq_array[ic], &r2c_msg, sizeof(r2c_msg), INFINITE);

   if (tstatus != 0) return tstatus;

  }

 }

 return 0;

}


DWORD WINAPI consumer(PVOID arg) {

 THARG * carg;

 DWORD tstatus, ithread;

 msg_block_t msg;

 queue_t *pr2cq;

 carg = (THARG *)arg;

 ithread = carg->thread_number;

 carg = (THARG *)arg;

 pr2cq = &r2cq_array[ithread];

 while (carg->work_done < carg->work_goal) {

  /* ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ β€” Π½Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ) сообщСния. */

  tstatus = q_get(pr2cq, &msg, sizeof(msg), INFINITE);

  if (tstatus != 0) return tstatus;

  carg->work_done++;

 }

 return 0;

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ многоступСнчатого ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°

Данная рСализация характСризуСтся Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ особСнностями, ΡΡƒΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… частично ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½Π° Π² коммСнтариях, Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Ρ… Π² листинг ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. На эти ΠΆΠ΅ особСнности ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ вашС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΈ упраТнСния 10.6, 10.7 ΠΈ 10.10.

β€’ Π—Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ возраТСния Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ способ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ основным ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ выполнСния ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π›ΡƒΡ‡ΡˆΠΈΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π±Ρ‹Π»ΠΎ Π±Ρ‹ использованиС ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ… ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΠ² оТидания Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… Ρ†ΠΈΠΊΠ»Π°Ρ… ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ° ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ° ΠΈ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ установлСн ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π»Π°Π³. Π”Ρ€ΡƒΠ³ΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΎΡ‚ΠΌΠ΅Π½Π΅ выполнСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΊΠ°ΠΊ описано Π΄Π°Π»Π΅Π΅ Π² этой Π³Π»Π°Π²Π΅.

β€’ ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° сущСствованиС симмСтрии ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰ΠΈΠΌ ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. Как ΠΈ ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, это ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΈ сопровоТдСниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

β€’ Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π½Π΅ сбалансирована Π² смыслС согласования скорости Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ сообщСний, Смкости ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° ΠΈ коэффициСнта блокирования "ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚Ρ‡ΠΈΠΊ/ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ".

β€’ Π’ Π΄Π°Π½Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 10.4) для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡ‹. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ экспСримСнтов с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ CRITICAL_SECTION Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ сколько-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎΠ³ΠΎ ускорСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° однопроцСссорной систСмС (см. ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π’). CS-вСрсия ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ThreeStageCS, находится Π½Π° Web-сайтС. Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π²Π΅Π»Π° сСбя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π² Π½Π΅ΠΉ Π±Ρ‹Π»Π° использована Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SignalObjectAndWait.

АсинхронныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€

ОсновноС Π²ΠΎΠ·Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ThreeSage.c (ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 10.5) Π² Π΅Π΅ Π½Ρ‹Π½Π΅ΡˆΠ½Π΅ΠΌ Π²ΠΈΠ΄Π΅, касаСтся прСкращСния выполнСния ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ TerminateThread. Π’ коммСнтариях, Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Ρ… Π² ΠΊΠΎΠ΄, Π²Π°ΠΌ прСдлагаСтся ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ Π½Π°Π΄ Π±ΠΎΠ»Π΅Π΅ элСгантным способом Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ выполнСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчивал Π±Ρ‹ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ освобоТдСниС рСсурсов.

Π”Ρ€ΡƒΠ³ΠΎΠΉ Π½Π΅Ρ€Π΅ΡˆΠ΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ являСтся отсутствиС ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° (Π½Π΅ считая использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ TerminateThread), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчивал Π±Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ сигнала ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΠΈΠ»ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π» Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Бобытия ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ сигналы ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π΅ΠΌΡƒ наступлСния автоматичСски сбрасываСмого события, ΠΈΠ»ΠΈ всСм ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΌ наступлСния Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ сбрасываСмого события, Π½ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сигнал Π±Ρ‹Π» ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ Π΄ΠΎ сих ΠΏΠΎΡ€ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ сводилось ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±ΡƒΠΆΠ΄Π°Π»ΠΈΡΡŒ всС ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ опрСдСляли, ΠΌΠΎΠ³ΡƒΡ‚ Π»ΠΈ ΠΎΠ½ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Иногда привлСкаСтся Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΡΡƒΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ состоит Π² Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ событий ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠ°ΠΊΠΎΠ³ΠΎ события слСдуСт пСрСвСсти Π² сигнальноС состояниС ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ SetEvent ΠΈΠ»ΠΈ PulseEvent.

ОбС эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ ΠΏΡƒΡ‚Π΅ΠΌ использования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² асинхронного Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ (Asynchronous Procedure Call, АРБ). Бобытия Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΈΠ»ΠΈ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ.

β€’ Π“Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ АРБ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π΄Π°Π½Π½ΠΎΠΉ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΡƒΡ‚Π΅ΠΌ помСщСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° АРБ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ АРБ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π’ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ нСсколько АРБ.