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

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

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

} MSG_BLOCK;


/* ΠžΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ, ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ ΠΊ заполнСнию Π½ΠΎΠ²Ρ‹ΠΌ сообщСниСм. */

MSG_BLOCK mblock = { 0, 0, 0, 0, 0 };


DWORD WINAPI produce(void*);

DWORD WINAPI consume(void*);

void MessageFill(MSG_BLOCK*);

void MessageDisplay(MSG_BLOCK*);


DWORD _tmain(DWORD argc, LPTSTR argv[]) {

 DWORD Status, ThId;

 HANDLE produce h, consume_h;

 /* Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ критичСский участок Π±Π»ΠΎΠΊΠ° сообщСния. */

 InitializeCriticalSection (&mblock.mguard);

 /* Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°. */

 produce_h = (HANDLE)_beginthreadex(NULL, 0, produce, NULL, 0, &ThId);

 consume_h = (HANDLE)_beginthreadex (NULL, 0, consume, NULL, 0, &ThId); 

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

 WaitForSingleObject(consume_h, INFINITE);

 WaitForSingleObject(produce_h, INFINITE);

 DeleteCriticalSection(&mblock.mguard);

 _tprintf(_T("ΠŸΠΎΡ‚ΠΎΠΊΠΈ производитСля ΠΈ потрСбитСля Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅\n"));

 _tprintf(_T("ΠžΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ: %d, ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ: %d, Π˜Π·Π²Π΅ΡΡ‚Π½Ρ‹Π΅ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ: %d\n"), mblock.sequence, mblock.nCons, mblock.nLost);

 return 0;

}


DWORD WINAPI produce(void *arg)

/* ΠŸΠΎΡ‚ΠΎΠΊ производитСля β€” созданиС Π½ΠΎΠ²Ρ‹Ρ… сообщСний Ρ‡Π΅Ρ€Π΅Π· случайныС */

/* ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. */

{

 srand((DWORD)time(NULL)); /* Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ число для Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° случайных чисСл. */

 while (!mblock.f_stop) {

  /* Блучайная Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°. */

  Sleep(rand() / 100);

  /* ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€. */

  EnterCriticalSection(&mblock.mguard);

  __try {

   if (!mblock.f_stop) {

    mblock.f_ready = 0;

    MessageFill(&mblock);

    mblock.f_ready = 1;

    mblock.sequence++;

   }

  } __finally { LeaveCriticalSection (&mblock.mguard); }

 }

 return 0;

}


DWORD WINAPI consume (void *arg) {

 DWORD ShutDown = 0;

 CHAR command, extra;

 /* ΠŸΡ€ΠΈΠ½ΡΡ‚ΡŒ ΠžΠ§Π•Π Π•Π”ΠΠžΠ• сообщСниС ΠΏΠΎ запросу ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. */

 while (!ShutDown) { /* ЕдинствСнный ΠΏΠΎΡ‚ΠΎΠΊ, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΉ доступ ΠΊ стандартным устройствам Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°. */

  _tprintf(_T("\n**Π’Π²Π΅Π΄ΠΈΡ‚Π΅ 'с' для ΠΏΡ€ΠΈΠ΅ΠΌΠ°; 's' для прСкращСния Ρ€Π°Π±ΠΎΡ‚Ρ‹: "));

  _tscanf("%c%c", &command, &extra);

  if (command == 's') {

   EnterCriticalSection(&mblock.mguard);

   ShutDown = mblock.f_stop = 1;

   LeaveCriticalSection(&mblock.mguard);

  } else if (command == 'c') { /* ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€ для ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹Ρ… сообщСний. */ 

   EnterCriticalSection(&mblock.mguard);

   __try {

    if (mblock.f_ready == 0) _tprintf(_T("НовыС сообщСния ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚. ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ.\n"));

    else {

     MessageDisplay(&mblock);

     mblock.nCons++;

     mblock.nLost = mblock.sequence – mblock.nCons;

     mblock.f_ready = 0; /* НовыС сообщСния ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚. */

    }

   } __finally { LeaveCriticalSection (&mblock.mguard); }

  } else {

   tprintf(_T("Вакая ΠΊΠΎΠΌΠ°Π½Π΄Π° отсутствуСт. ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ.\n"));

  }

 }

 return 0;

}


void MessageFill(MSG_BLOCK *mblock) {

 /* Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ сообщСния содСрТимым, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму ΠΈ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. */

 DWORD i;

 mblock->checksum = 0;

 for (i = 0; i < DATA_SIZE; i++) {

  mblock->data[i] = rand();

  mblock->checksum ^= mblock->data[i];

 }

 mblock->timestamp = time(NULL);

 return;

}


void MessageDisplay(MSG_BLOCK *mblock) {

 /* ΠžΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ сообщСния, ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму. */

 DWORD i, tcheck = 0;

 for (i = 0; i < DATA_SIZE; i++) tcheck ^= mblock->data[i];

 _tprintf(_T("\nВрСмя Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ сообщСния β„– %d: %s"), mblock->sequence, _tctime(&(mblock->timestamp)));

 _tprintf(_T("ΠŸΠ΅Ρ€Π²Π°Ρ ΠΈ послСдняя записи: %Ρ… %Ρ…\n"), mblock->data[0], mblock->data[DATA_SIZE – 1]);

 if (tcheck == mblock->checksum) _tprintf(_T("Π£Π‘ΠŸΠ•Π¨ΠΠΠ― ΠžΠ‘Π ΠΠ‘ΠžΠ’ΠšΠ –>ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма совпадаСт.\n"));

 else tprintf(_T("Π‘Π‘ΠžΠ™ –>НСсовпадСниС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы. Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ Π·Π°ΠΏΠΎΡ€Ρ‡Π΅Π½ΠΎ.\n"));

 return;

}

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ простой систСмы "ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ/ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ"

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ соглашСния, ΠΊΠ°ΡΠ°ΡŽΡ‰ΠΈΠ΅ΡΡ программирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²Π°ΠΆΠ½Ρ‹ для нас Π½Π° протяТСнии этой ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π³Π»Π°Π².

β€’ ΠžΠ±ΡŠΠ΅ΠΊΡ‚ CRITICAL_SECTION являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (Π±Π»ΠΎΠΊΠ° сообщСния), Π·Π°Ρ‰ΠΈΡ‚Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ обСспСчиваСт.

β€’ ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ доступ ΠΊ ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΡŽ осущСствляСтся Π½Π° критичСском участкС ΠΊΠΎΠ΄Π°.

β€’ Π’ΠΈΠΏΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ осущСствляСтся Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, являСтся volatile.

β€’ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ CS Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ освобоТдСны. Π₯отя Π² Π΄Π°Π½Π½ΠΎΠΌ случаС эта ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° ΠΈ Π½Π΅ являСтся для нас сущСствСнной, ΠΎΠ½Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ LeaveCriticalSection Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ случайно ΠΎΠΏΡƒΡ‰Π΅Π½ впослСдствии ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ использованиСм срСдств Π‘, ΠΈ Π΅Π³ΠΎ Π½Π΅ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ совмСстно с C++.

β€’ Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ MessageFill ΠΈ MessageDisplay Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ лишь Π½Π° критичСских участках ΠΊΠΎΠ΄Π° ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ для Π½ΡƒΠΆΠ΄ своих вычислСний Π½Π΅ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ, Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ. ΠšΡΡ‚Π°Ρ‚ΠΈ, ΠΎΠ±Π΅ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΈ Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…, Π½ΠΎ ΠΈΡ… листинги большС ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚.

β€’ ΠΠ΅ сущСствуСт ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ способа, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ производитСля ΠΌΠΎΠ³ Π±Ρ‹ ΠΈΠ·Π²Π΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ потрСбитСля ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ сообщСния, ΠΈ поэтому ΠΏΠΎΡ‚ΠΎΠΊ потрСбитСля Π΄ΠΎΠ»ΠΆΠ΅Π½ просто ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ установлСн Ρ„Π»Π°Π³ готовности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ†ΠΈΠΈ появлСния Π½ΠΎΠ²ΠΎΠ³ΠΎ сообщСния. Π£ΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ этот нСдостаток Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ событий ядра.

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

0 <= nLost + nCons <= sequence

Об этом Π²Π°ΠΆΠ½ΠΎΠΌ свойствС Π΄Π°Π»Π΅Π΅ Π΅Ρ‰Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ΄Ρ‚ΠΈ Ρ€Π΅Ρ‡ΡŒ.

β€’ О нСобходимости прСкращСния ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ производитСля ΡƒΠ·Π½Π°Π΅Ρ‚ лишь послС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ„Π»Π°Π³Π°, устанавливаСмого Π² Π±Π»ΠΎΠΊΠ΅ сообщСния ΠΏΠΎΡ‚ΠΎΠΊΠ° потрСбитСля. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ собой Π½ΠΈΠΊΠ°ΠΊΠΈΠΌΠΈ сигналами, Π° Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ TerminateThread Ρ‡Ρ€Π΅Π²Π°Ρ‚ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌΠΈ эффСктами, эта ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° являСтся ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΌ способом остановки Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. РазумССтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эта ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° Π±Ρ‹Π»Π° ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ, Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ скоординированной. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ блокировался, ΠΈΠ½Π°Ρ‡Π΅ ΠΎΠ½ Π½Π΅ смоТСт Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π»Π°Π³; способы Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ±ΡΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² Π³Π»Π°Π²Π΅ 10.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ CRITICAL_SECTION ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π² нашС распоряТСниС ΠΌΠΎΡ‰Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ синхронизации, Π½ΠΎ, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΎΠ½ΠΈ Π½Π΅ Π² состоянии ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ всю ΠΏΠΎΠ»Π½ΠΎΡ‚Ρƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй. О нСвозмоТности ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сигналов ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΌΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π°ΠΌΠΈ оТидания (time-out). ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ синхронизации ядра Windows ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ остроту Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ этих, Π½ΠΎ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ.

ΠœΡŒΡŽΡ‚Π΅ΠΊΡΡ‹

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

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ² Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ CS, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ возмоТности ΠΈΡ… совмСстного использования Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ процСссами, ΠΎΠ½ΠΈ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Ρ‹ оТидания, Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡ‹, ΠΏΠΎΠΊΠΈΠ½ΡƒΡ‚Ρ‹Π΅ (abandoned) Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΌΡΡ процСссом, пСрСходят Π² сигнальноС состояниС.[29] ΠŸΠΎΡ‚ΠΎΠΊ ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π°Π΅Ρ‚ ΠΏΡ€Π°Π²Π° владСния ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ (ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ (block) ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ) ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ оТидания (WaitForSingleObject ΠΈΠ»ΠΈ WaitForMultipleObjects) ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ дСскриптору ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΈ уступаСт эти ΠΏΡ€Π°Π²Π° посрСдством Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ReleaseMutex.

Как всСгда, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠΈ своСврСмСнно освобоТдали рСсурсы, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ΠΈ большС Π½Π΅ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ. ΠŸΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π»Π°Π΄Π΅Π²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ рСсурсом нСсколько Ρ€Π°Π·, ΠΈ ΠΏΡ€ΠΈ этом Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄Π°ΠΆΠ΅ Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° ΡƒΠΆΠ΅ Π²Π»Π°Π΄Π΅Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹ΠΌ рСсурсом. Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счСтС, ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·, сколько ΠΎΠ½Π° Π΅Π³ΠΎ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π»Π°. Вакая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ рСкурсивного Π·Π°Ρ…Π²Π°Ρ‚Π° рСсурсов, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ ΠΈ Π² случаС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² CS, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ для ограничСния доступа ΠΊ рСкурсивным функциям, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² прилоТСниях, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ (nested transactions).  

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°ΠΌΠΈ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ функциями CreateMutex, ReleaseMutex ΠΈ OpenMutex.