ΠΠ±ΡΠ°Π·Π½ΠΎ Π³ΠΎΠ²ΠΎΡΡ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌΠΎΠ΅ ΡΠΎΠ±ΡΡΠΈΠ΅ β ΡΡΠΎ Π΄Π²Π΅ΡΡ, ΡΠ½Π°Π±ΠΆΠ΅Π½Π½Π°Ρ ΠΏΡΡΠΆΠΈΠ½ΠΎΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π°ΠΊΡΡΡΠΈΠ΅ Π΄Π²Π΅ΡΠΈ, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ Π²ΡΡΡΠ½ΡΡ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌΠΎΠ΅ ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΏΠΎΠ΄ΠΎΠ±ΠΈΡΡ Π΄Π²Π΅ΡΠΈ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΡΠΆΠΈΠ½Π° ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ ΠΈ ΠΊΠΎΡΠΎΡΠ°Ρ, Π±ΡΠ΄ΡΡΠΈ ΡΠ°Π· ΠΎΡΠΊΡΡΡΠΎΠΉ, ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ ΠΎΡΡΠ°Π²Π°ΡΡΡΡ Π² ΡΠ°ΠΊΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΡ ΠΌΠ΅ΡΠ°ΡΠΎΡΡ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ PulseEvent ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ Π΄Π²Π΅ΡΡ ΠΈ Π·Π°ΠΊΡΡΠ²Π°Π΅Ρ Π΅Π΅ ΡΡΠ°Π·Ρ ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΡΠ΅ΡΠ΅Π· Π½Π΅Π΅ ΠΏΡΠΎΡ ΠΎΠ΄ΡΡ ΠΎΠ΄Π½Π° (Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌΡΠ΅ ΡΠΎΠ±ΡΡΠΈΡ) ΠΈΠ»ΠΈ Π²ΡΠ΅ (Π²ΡΡΡΠ½ΡΡ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌΡΠ΅ ΡΠΎΠ±ΡΡΠΈΡ) ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ. Π€ΡΠ½ΠΊΡΠΈΡ SetEvent ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ Π΄Π²Π΅ΡΡ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ Π΅Π΅.
ΠΡΠΈΠΌΠ΅Ρ: ΡΠΈΡΡΠ΅ΠΌΠ° "ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ/ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ"
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ 8.1 ΡΠ°ΡΡΠΈΡΡΡΡΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΌΠΎΠ³ Π΄ΠΎΠΆΠΈΠ΄Π°ΡΡΡΡ ΠΌΠΎΠΌΠ΅Π½ΡΠ°, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡΠ²ΠΈΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅. Π’Π΅ΠΌ ΡΠ°ΠΌΡΠΌ ΡΡΡΡΠ°Π½ΡΠ΅ΡΡΡ ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΡΠ²ΡΠ·Π°Π½Π½Π°Ρ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΠ» Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎ ΠΏΠΎΠ²ΡΠΎΡΡΡΡ ΠΏΠΎΠΏΡΡΠΊΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π½ΠΎΠ²ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. Π Π΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° (ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 8.2) Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ eventPC.
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ Π² ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΠΌΠΎΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠΈ Π²ΠΌΠ΅ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² CRITICAL_SECTION ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΌΡΡΡΠ΅ΠΊΡΡ; Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½ΠΎΠΉ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΡΠ»ΡΠΆΠΈΠ»ΠΎ Π»ΠΈΡΡ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ»Π»ΡΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΡΡΡΠ΅ΠΊΡΠΎΠ². Π ΡΠΎ ΠΆΠ΅ Π²ΡΠ΅ΠΌΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠΎΠ±ΡΡΠΈΡ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ SetEvent Π² ΠΏΠΎΡΠΎΠΊΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²Π΅ΡΡΠΌΠ° ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°.
Π’Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΏΠΎΡΠΎΠ± ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΡ ΠΌΡΡΡΠ΅ΠΊΡΠ° ΠΈ ΡΠΎΠ±ΡΡΠΈΡ ΡΠΎ ΡΡΡΡΠΊΡΡΡΠΎΠΉ Π΄Π°Π½Π½ΡΡ Π±Π»ΠΎΠΊΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. ΠΡΡΡΠ΅ΠΊΡ Π°ΠΊΡΠΈΠ²ΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΡΠ°ΡΡΠΎΠΊ ΠΊΠΎΠ΄Π° Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ , ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΏΠΎΡΠ²ΠΈΠ»ΠΎΡΡ Π½ΠΎΠ²ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅. ΠΠ±ΠΎΠ±ΡΠ°Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΌΡΡΡΠ΅ΠΊΡ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ½Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π° ΡΠΎΠ±ΡΡΠΈΠ΅ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΎ Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ. ΠΡΠ° Π±Π°Π·ΠΎΠ²Π°Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠ° ΡΠΈΡΠΎΠΊΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π² ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΡ Π³Π»Π°Π²Π°Ρ .
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 8.2. eventPC: ΡΠΈΡΡΠ΅ΠΌΠ° "ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ/ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ", ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ°Ρ ΡΠΈΠ³Π½Π°Π»Ρ/* ΠΠ»Π°Π²Π° 8. eventPC.Ρ */
/* ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π΄Π²Π° ΠΏΠΎΡΠΎΠΊΠ° β ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ. */
/* ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΠ·Π΄Π°Π΅Ρ Π±ΡΡΠ΅ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΠΌΠΈ */
/* ΡΡΠΌΠΌΠ°ΠΌΠΈ, ΠΈΠ»ΠΈ "Π±Π»ΠΎΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ", ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΡΡΡΠΈΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΎ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ*/
/* ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. ΠΠΎΡΠΎΠΊ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π² ΠΎΡΠ²Π΅Ρ Π½Π° Π·Π°ΠΏΡΠΎΡ.*/
#include "EvryThng.h"
#include <time.h>
#define DATA_SIZE 256
typedef struct msg_block_tag { /* ΠΠ»ΠΎΠΊ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. */
volatile DWORD f_ready, f_stop; /* Π€Π»Π°Π³ΠΈ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ ΠΈ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ΅Π½ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. */
volatile DWORD sequence; /* ΠΠΎΡΡΠ΄ΠΊΠΎΠ²ΡΠΉ Π½ΠΎΠΌΠ΅Ρ Π±Π»ΠΎΠΊΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. */
volatile DWORD nCons, nLost; time_t timestamp;
HANDLE mguard; /* ΠΡΡΡΠ΅ΠΊΡ, Π·Π°ΡΠΈΡΠ°ΡΡΠΈΠΉ ΡΡΡΡΠΊΡΡΡΡ Π±Π»ΠΎΠΊΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. */
HANDLE mready; /* Π‘ΠΎΠ±ΡΡΠΈΠ΅ "Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π³ΠΎΡΠΎΠ²ΠΎ". */
DWORD checksum; /* ΠΠΎΠ½ΡΡΠΎΠ»ΡΠ½Π°Ρ ΡΡΠΌΠΌΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. */
DWORD data[DATA_SIZE]; /* Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. */
} MSG_BLOCK;
/* β¦ */
DWORD _tmain(DWORD argc, LPTSTR argv[]) {
DWORD Status, ThId;
HANDLE produce_h, consume_h;
/* ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΌΡΡΡΠ΅ΠΊΡ ΠΈ ΡΠΎΠ±ΡΡΠΈΠ΅ (Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌΠΎΠ΅) Π² Π±Π»ΠΎΠΊΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. */
mblock.mguard = CreateMutex(NULL, FALSE, NULL);
mblock.mready = CreateEvent(NULL, FALSE, FALSE, NULL);
/* Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΏΠΎΡΠΎΠΊΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ; ΠΎΠΆΠΈΠ΄Π°ΡΡ ΠΈΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ.*/
/* β¦ ΠΠ°ΠΊ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ 9.1 β¦ */
CloseHandle(mblock.mguard);
CloseHandle(mblock.mready);
_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() / 10); /* ΠΠ»ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΠ΅ΡΠΈΠΎΠ΄ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. */
/* ΠΠΎΠ»ΡΡΠΈΡΡ ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΡ Π±ΡΡΠ΅Ρ. */
WaitForSingleObject(mblock.mguard, INFINITE);
__try {
if (!mblock.f_stop) {
mblock.f_ready = 0;
MessageFill(&mblock);
mblock.f_ready = 1;
mblock.sequence++;
SetEvent(mblock.mready); /* Π‘ΠΈΠ³Π½Π°Π» "Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π³ΠΎΡΠΎΠ²ΠΎ". */
}
} __finally { ReleaseMutex (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') {
WaitForSingleObject(mblock.mguard, INFINITE);
ShutDown = mblock.f_stop = 1;
ReleaseMutex(mblock.mguard);
} else if (command == 'c') {
/* ΠΠΎΠ»ΡΡΠΈΡΡ Π½ΠΎΠ²ΡΠΉ Π±ΡΡΠ΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. */
WaitForSingleObject(mblock.mready, INFINITE);
WaitForSingleObject(mblock.mguard, INFINITE);
__try {
if (!mblock.f_ready) _leave;
/* ΠΠΆΠΈΠ΄Π°ΡΡ Π½Π°ΡΡΡΠΏΠ»Π΅Π½ΠΈΠ΅ ΡΠΎΠ±ΡΡΠΈΡ, ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΠ΅Π³ΠΎ Π½Π° Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. */
MessageDisplay(&mblock);
mblock.nCons++;
mblock.nLost = mblock.sequence β mblock.nCons;
mblock.f_ready = 0; /* ΠΠΎΠ²ΡΠ΅ Π³ΠΎΡΠΎΠ²ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΡΡΡΡΡΡΠ²ΡΡΡ. */
} __finally { ReleaseMutex (mblock.mguard); }
} else {
_tprintf(_T("ΠΠ΅Π΄ΠΎΠΏΡΡΡΠΈΠΌΠ°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°. ΠΠΎΠ²ΡΠΎΡΠΈΡΠ΅ ΠΏΠΎΠΏΡΡΠΊΡ.\n"));
}
}
return 0;
}
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΏΠΎΡΠΎΠΊ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ, ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½Π½ΡΠΉ ΠΎ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π½Π΅ ΡΡΠΏΠ΅Π΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ΅ΠΊΡΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΡΠΎΠΊ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΡΠ³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ Π΅ΡΠ΅ ΠΎΠ΄Π½ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎ Π·Π°Ρ Π²Π°ΡΠ° ΠΌΡΡΡΠ΅ΠΊΡΠ° ΠΏΠΎΡΠΎΠΊΠΎΠΌ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΠΎΡΠΎΠΊ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π΄Π²Π°ΠΆΠ΄Ρ, Π΅ΡΠ»ΠΈ Π±Ρ Π½Π΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°, ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Π½Π°Ρ Π² Π½Π°ΡΠ°Π»Π΅ try-Π±Π»ΠΎΠΊΠ° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ. ΠΡΠ° ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΎΠ±ΡΡΠΆΠ΄Π°ΡΡΡΡ Π² Π³Π»Π°Π²Π΅ 10.
ΠΠ±Π·ΠΎΡ: ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Windows
ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Windows ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Ρ Π² ΡΠ°Π±Π». 8.2.
Π’Π°Π±Π»ΠΈΡΠ° 8.2. Π‘ΡΠ°Π²Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Windows
CRITICAL_SECTION ΠΡΡΡΠ΅ΠΊΡ Π‘Π΅ΠΌΠ°ΡΠΎΡ Π‘ΠΎΠ±ΡΡΠΈΠ΅ ΠΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΉ Π·Π°ΡΠΈΡΠ°Π΅ΠΌΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΠ΅Ρ ΠΠ° ΠΠ° ΠΠ° ΠΠΎΡΡΡΠΏΠ½ΠΎΡΡΡ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΠ΅Ρ ΠΠ° ΠΠ° ΠΠ° Π‘ΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΡ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΡΡ ΠΎΠ΄ ΠΡΡΡΠ΅ΠΊΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ ΠΈΠ»ΠΈ ΠΎΡΡΠ°Π²Π»Π΅Π½ Π±Π΅Π· ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ. ΠΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΡΡΡ Π»ΡΠ±ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ. Π€ΡΠ½ΠΊΡΠΈΠΈ SetEvent, PulseEvent. ΠΡΠ°Π²Π° Π²Π»Π°Π΄Π΅Π½ΠΈΡ Π ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈΠΌΠ΅ΡΡ ΠΏΡΠ°Π²Π° Π²Π»Π°Π΄Π΅Π»ΡΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ. ΠΠ»Π°Π΄Π΅ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡ Π²Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·, Π½Π΅ Π±Π»ΠΎΠΊΠΈΡΡΡ ΡΠ²ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Π ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈΠΌΠ΅ΡΡ ΠΏΡΠ°Π²Π° Π²Π»Π°Π΄Π΅Π»ΡΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ. ΠΠ»Π°Π΄Π΅ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·, Π½Π΅ Π±Π»ΠΎΠΊΠΈΡΡΡ ΡΠ²ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. ΠΠΎΠ½ΡΡΠΈΠ΅ Π²Π»Π°Π΄Π΅Π½ΠΈΡ Π½Π΅ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ. ΠΠΎΡΡΡΠΏ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ, ΡΠΈΡΠ»ΠΎ ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΡΠ΅ΡΡΠΈΠΊΠ°. ΠΠΎΠ½ΡΡΠΈΠ΅ Π²Π»Π°Π΄Π΅Π½ΠΈΡ Π½Π΅ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ. Π€ΡΠ½ΠΊΡΠΈΠΈ SetEvent ΠΈ PulseEvent ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π²ΡΠ·Π²Π°Π½Ρ Π»ΡΠ±ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ. Π Π΅Π·ΡΠ»ΡΡΠ°Ρ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ Π Π°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ Π²Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° ΠΈΠ· ΡΠΈΡΠ»Π° ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΡ . ΠΡΠ»Π΅Π΄ Π·Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠ°Π²Π° Π²Π»Π°Π΄Π΅Π½ΠΈΡ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ ΠΏΡΠΈΠΎΠ±ΡΠ΅ΡΡΠΈ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊΡ ΠΈΠ· ΡΠΈΡΠ»Π° ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΡ . ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ³ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΡΠΈΡΠ»ΠΎ ΠΊΠΎΡΠΎΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΠ΅ΠΊΡΡΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΡΠ΅ΡΡΠΈΠΊΠ°. ΠΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΉ SetEvent ΠΈΠ»ΠΈ PulseEvent ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ².ΠΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²