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

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

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

ВосстановлСниС Β«ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠ³ΠΎΒ» ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°

#include <sys/neutrino.h>

int SyncMutexRevive(sync_t* sync);

int SyncMutexRevive_r(sync_t* sync);

Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ [36]ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для восстановлСния ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ находится Π² состоянии блокирования

DEAD
. ΠœΡŒΡŽΡ‚Π΅ΠΊΡ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² состояниС
DEAD
, ΠΊΠΎΠ³Π΄Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ, использованная ΠΏΡ€ΠΈ Π·Π°Ρ…Π²Π°Ρ‚Π΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, освобоТдаСтся. Π’Π°ΠΊΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° ΡƒΠΌΠΈΡ€Π°Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ, Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ²ΡˆΠΈΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, располоТСнный Π² раздСляСмой памяти. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Ρ‹Π·ΠΎΠ²Π° Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ становится Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, ΠΈ Π΅Π³ΠΎ счСтчик Π·Π°Ρ…Π²Π°Ρ‚ΠΎΠ² устанавливаСтся Π² 1 для рСкурсивного ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°.

Ошибки выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

Π•FAULT
β€” ошибка ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ;

EINVAL
β€” ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ синхронизации Π½Π΅ сущСствуСт ΠΈΠ»ΠΈ Π½Π΅ находится Π² состоянии
DEAD
;

ETIMEDOUT
β€” ΠΎΡ‚ΠΌΠ΅Π½Π° Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΠΎ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Ρƒ ядра (устанавливаСтся Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ
TimerTimeout()
).

Установка увСдомлСния ΠΎ «смСрти» ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ состояниС ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΊΠ°ΠΊ

DEAD
ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
SyncMutexEvent()
, которая опрСдСляСт событиС, связанноС со Β«ΡΠΌΠ΅Ρ€Ρ‚ΡŒΡŽΒ» ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°.

#include <sys/neutrino.h>

int SyncMutexEvent(sync_t* sync, struct sigevent* event);

int SyncMutexEvent_r(sync_t* sync, struct sigevent* event);

Данная функция ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для установки ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ситуации, ΠΊΠΎΠ³Π΄Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² состояниС

DEAD
(Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ пСрСраспрСдСляСтся ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π» Π·Π°Ρ…Π²Π°Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°). Π—Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, оказавшийся Π² состоянии
DEAD
, ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°Π»Π΅Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
SyncMutexRevive()
.

Ошибки выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

EAGAIN
β€” Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ядро Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ рСсурсов для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запроса;

EFAULT
β€” ошибка ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ обращСния ΠΊ
sync
;

EINVAL
β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ синхронизации, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚
sync
, Π½Π΅ сущСствуСт.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ примСнСния ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°

ΠœΠΎΠ΄Π΅Ρ€Π½ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ наш ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π°, посвящСнного использованию сСмафора для случая мноТСства ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² источников ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ

push()
ΠΈΠ»ΠΈ
pop()
, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ сильная ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Π°, поэтому ΠΊΠΎΠ΄ этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ эксклюзивно, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ. Π Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ двумя способами: Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ сСмафором ΠΈΠ»ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ. ΠœΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΈ Π½ΠΈΠΆΠ΅ расскаТСм ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ здСсь смСшали Π² ΠΎΠ΄Π½ΠΎΠΉ конструкции эти Π΄Π²Π° элСмСнта синхронизации.

/* Π¨Π°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ класс ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… */

template <class T> class CDataQueue {

public:

Β CDataQueue() { pthread_mutex_init(&_mutex, NULL); }

Β ~CDataQueue() { pthread_mutex_destroy(&_mutex); }

Β void push(T _new_data) {

<b>Β  pthread_mutex_lock(&amp;_mutex);</b>

Β  data_queue.push(_new_data);

Β  data_event.reset();

<b>Β  pthread_mutex_unlock(&amp;_mutex);</b>

Β }

Β T pop() {

Β  data_event.wait();

<b>Β  pthread_mutex_lock(&amp;_mutex);</b>

Β  T res = data_queue.front();

Β  data_queue.pop();

<b>Β  pthread_mutex_unlock(&amp;_mutex);</b>

Β  return res;

Β }

private:

Β std::queue&lt;T&gt; data_queue;

Β event data_event;

Β pthread_mutex_t _mutex;

};

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд Π·Π°Π΄Π°Ρ‡Π° ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Π°: Π½Π°Π΄ΠΎ Π½Π΅ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ исполнСния Π΄Π²ΡƒΡ… участков ΠΊΠΎΠ΄Π°. ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΆΠ΅ Π½Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ сСмафором, ΠΊΠ°ΠΊ ΠΌΡ‹ описывали, ΠΊΠΎΠ³Π΄Π° рассказывали ΠΎ способах Π΅Π³ΠΎ примСнСния? Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ срСдство ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, Π½Π΅ зависящСС ΠΎΡ‚ Π΄ΠΎΠΏΡƒΡ‰Π΅Π½ΠΈΠΉ ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ стСпСни ΠΈΡ… зависимости. Когда ΠΌΡ‹ строим систСму Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, вопрос Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ нСявного влияния Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π° становится ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½Ρ‹ΠΌ. ΠœΡ‹ ΡƒΠΆΠ΅ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ эффСкт инвСрсии ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² ΠΈ Ρ‚Π΅ способы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π΅Π΅ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ эксклюзивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ ΠΈ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ

Π’ этом мСстС Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€Π΅Ρ€Π²Π΅ΠΌ нашС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ повСствованиС: ΠΌΡ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈ рассмотрСниС Π΄Π²ΡƒΡ… Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ извСстных, Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΈ примСняСмых ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² синхронизации β€” сСмафора ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°. Π’Π΅ΠΏΠ΅Ρ€ΡŒ сдСлаСм ΠΊΠΎΡ€ΠΎΡ‚ΠΊΡƒΡŽ остановку ΠΈ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅ΠΌ ΠΈΡ… Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ сравнСниС, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ процСссорной ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Π΅ этими ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°ΠΌΠΈ.

Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд эти Π΄Π²Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π² Π²Ρ‹ΡΡˆΠ΅ΠΉ стСпСни ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹, особСнно Ссли Ρ€Π΅Ρ‡ΡŒ Π·Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΎ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ сСмафорС, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅ΠΌ значСния счСтчика 0 Π»ΠΈΠ±ΠΎ 1. ΠΠ°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹, Ρ‡Ρ‚ΠΎ ΠΈ Π² обсуТдСниях, ΠΈ Π΄Π°ΠΆΠ΅ Π² Π½Π΅ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ утвСрТдСния, Ρ‡Ρ‚ΠΎ это Β«ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅Β». БСйчас ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ эти Π΄Π²Π° сходных ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ всСм: ΠΈ Π·Π°Ρ‚Ρ€Π°Ρ‚Π°ΠΌΠΈ процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° ΠΈΡ… обслуТиваниС, ΠΈ цСлями ΠΈ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠ·Π²Π°Π½Ρ‹ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ, ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Тизни… НачнСм с простой ΠΎΡ†Π΅Π½ΠΊΠΈ Π·Π°Ρ‚Ρ€Π°Ρ‚ процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° обслуТиваниС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ², послС Ρ‡Π΅Π³ΠΎ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ различия станут Π½Π°ΠΌ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ понятнСС.

Для провСдСния Ρ‚Π°ΠΊΠΈΡ… ΠΎΡ†Π΅Π½ΠΎΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡƒΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ²ΡˆΡƒΡŽΡΡ Π½Π°ΠΌΠΈ схСму «симмСтричных» тСстов. ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΡ…? Π”Π°, здСсь Π½Π°ΠΌ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Π² явном Π²ΠΈΠ΄Π΅ ΠΎΠ±ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ «симмСтричными» тСстами просто Π² силу ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»ΠΎΠΊ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ написано Ρ€Π°Π½Π΅Π΅. Π˜Ρ‚Π°ΠΊ, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ тСста для ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ( Ρ„Π°ΠΉΠ» sy20m.cc):

БкоростныС ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°

unsigned long N = 1000;

static pthread_barrier_t bstart;

static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;