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, ΠΠ Π‘). Π‘ΠΎΠ±ΡΡΠΈΡ ΡΠ°Π·Π²ΠΈΠ²Π°ΡΡΡΡ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, ΠΏΡΠΈΡΠ΅ΠΌ ΡΠ°Π±ΠΎΡΠΈΠΉ ΠΈΠ»ΠΈ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΠΏΠΎΡΠΎΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ Π³Π»Π°Π²Π½ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ.
β’ ΠΠ»Π°Π²Π½ΡΠΉ ΠΏΠΎΡΠΎΠΊ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΠ Π‘-ΡΡΠ½ΠΊΡΠΈΡ Π΄Π°Π½Π½ΠΎΠΉ ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° ΠΏΡΡΠ΅ΠΌ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΠ Π‘ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΠ Π‘ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°. Π ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΠ Π‘.