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

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

Автор ОлСг Π¦ΠΈΠ»ΡŽΡ€ΠΈΠΊ

EOK β€” ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅;

EAGAIN β€” ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ использовании статичСски ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния/записи (PTHREAD_RWLOCK_INITIALIZER) нСдостаточно систСмных рСсурсов для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния/записи;

EDEADLK β€” Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΡƒΠΆΠ΅ являСтся Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π² эксклюзивном Ρ€Π΅ΠΆΠΈΠΌΠ΅;

EFAULT β€” сбой ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ядра ΠΊ rwl;

EINVAL β€” rwl ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния/записи.

Ѐункция pthread_rwlock_trywrlock() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ значСния:

EOK β€” ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅;

EAGAIN β€” ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ использовании статичСски ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния/записи (PTHREAD_RWLOCK_INITIALIZER) нСдостаточно систСмных рСсурсов для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния/записи;

EBUSY β€” Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΡƒΠΆΠ΅ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π° Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ чтСния ΠΈΠ»ΠΈ записи;

EDEADLK β€” Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΡƒΠΆΠ΅ являСтся Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π² эксклюзивном Ρ€Π΅ΠΆΠΈΠΌΠ΅;

EFAULT β€” сбой ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ядра ΠΊ rwl;

EINVAL β€” rwl ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния/записи.

Ѐункция pthread_rwlock_timedwrlock() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ значСния:

EOK β€” ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅;

EAGAIN β€” систСма Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΏΠΎ записи, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ достигнуто максимальноС число Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΏΠΎ записи для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°;

EDEADLK β€” Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΡƒΠΆΠ΅ являСтся Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π² эксклюзивном Ρ€Π΅ΠΆΠΈΠΌΠ΅;

EINVAL β€” Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π²Ρ‹Π·ΠΎΠ²Π°: Π»ΠΈΠ±ΠΎ rwl ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния/записи, Π»ΠΈΠ±ΠΎ врСмя Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π° abs Π·Π°Π΄Π°Π½ΠΎ мСньшС нуля ΠΈΠ»ΠΈ Ρ€Π°Π²Π½ΠΎ ΠΈΠ»ΠΈ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния 1000 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ²;

ETIMEDOUT β€” Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π΄ΠΎ истСчСния Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ срока Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π°.

ОсвобоТдСниС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ

int pthread_rwlock_unlock(pthread_rwlock_t* rwl);

Ѐункция освобоТдаСт Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ Π»ΡŽΠ±Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния/записи. Если ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Ρ‹Π» Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ мноТСствСнного использования (Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΏΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΡŽ), Ρ‚ΠΎ количСство Π΅Π³ΠΎ освобоТдСний Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ€Π°Π²Π½ΡΡ‚ΡŒΡΡ количСству Π·Π°Ρ…Π²Π°Ρ‚ΠΎΠ².

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния:

EOK β€” ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅;

EAGAIN β€” ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ использовании статичСски ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния/записи (PTHREAD_RWLOCK_INITIALIZER) нСдостаточно систСмных рСсурсов для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния/записи;

EFAULT β€” ядро Π½Π΅ смогло ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ rwl;

EINVAL β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ rwl ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π½Π΅Π²Π΅Ρ€Π½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния/записи;

EPERM β€” Π½Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ²ΡˆΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ rwl Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ чтСния ΠΈΠ»ΠΈ записи, ΠΈΠ»ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π²Π»Π°Π΄Π΅Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ записи.

ИспользованиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ чтСния/записи

ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ чтСния/записи (Ρ„Π°ΠΉΠ» sy10.cc):

Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния/записи

#include <sys/syspage.h>

#include <sys/neutrino.h>

#include <list>


// сколь ΡƒΠ³ΠΎΠ΄Π½ΠΎ слоТныС элСмСнты Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

// прилоТСния; Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΈΡ… ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ Π²ΠΈΠ΄

typedef int element;


// Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… прилоТСния - динамичСский список элСмСнтов

class dbase : public list<element> {

 static const int READ_DELAY = 1, WRITE_DELAY = 2;

public:

 // опСрация "Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…"

 void add(const element& e) {

  int pos = size() * rand() / RAND_MAX;

  list<element>::iterator p = begin();

  for (int i = 0; i < pos; i++) p++;

  insert(p, e);

  delay(WRITE_DELAY);

 }

 // опСрация "Π½Π°ΠΉΡ‚ΠΈ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…"

 int pos(const element& e) {

  int n = 0;

  for (list<element>::iterator i = begin(); i != end(); i++, n++)

   if (*i == e) {

    delay(READ_DELAY);

    break;

   }

  if (n == size()) n = -1;

  return n;

 }

} data;


inline element erand(unsigned long n) {

 return (element)((n * rand()) / RAND_MAX);

}


inline bool wrand(double p) {

 return (double)rand() / (double)RAND_MAX < p;

}


int main(int argc, char *argv[]) {

 // ΠΎΠ±Ρ‰Π΅Π΅ число ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ прилоТСния ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…

 static unsigned long n = 1000;

 // Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ обновлСния Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ

 static double p = .1;

 unsigned long m;

 if (argc > 1 && (m = atoll(argv[1])) ! = 0) n = m;

 double q;

 if (argc > 2 && (q = atof(argv[2])) != 0) p = q;

 // Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

 for (int i = 0; i < n; i++) data.add(erand(n));

 // тактовая частота процСссора (для измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ)

 const uint64_t cps = SYSPAGE_ENTRY(qtime)->cycles_per_sec;

 // ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ n ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…,

 // ΠΈΠ· Π½ΠΈΡ… p*n Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ обновлСния списка, Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅

 // (1-p)*n Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…:

 uint64_t t = ClockCycles();

 for (int i = 0; i < n; i++) {

  element e = erand(n);

  if (!wrand(p)) data.pos(e);

  else data.add(e);

 }

 t = ((ClockCycles() - t) * 1000000000) / cps;

 cout << "evaluation time: " << (double)t / 1.E9

  << " sec." << endl;

 return EXIT_SUCCESS;

}

ΠŸΠ΅Ρ€Π΅Π΄ Π½Π°ΠΌΠΈ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, которая массированно Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ свою Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΈΠ·Ρ€Π΅Π΄ΠΊΠ° Π΅Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚. Для выполнСния Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ чтСния/записи Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ достаточно ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ эти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°ΠΌΠΈ delay(WRITE_DELAY) ΠΈ delay(READ_DELAY).

Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ СстСствСнноС ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ запросы ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ Π² ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ (Ρ„Π°ΠΉΠ» sy11.cc). Для этого ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ структуру списка элСмСнтов, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ:

class dbase : public list<element> {

 static const int READ_DELAY = 1, WRITE_DELAY = 2;

 pthread_mutex_t loc;

public:

 dbase(void) { pthread_mutex_init(&loc, NULL); }

 ~dbase(void) { pthread_mutex_destroy(&loc); }

 void add(const elements e) {

  pthread_mutex_lock(&loc);

  int pos = size() * rand() / RAND_MAX;

  list<element>::iterator p = begin();

  for (int i = 0; i < pos; i++) p++;

  insert(p, e);

  delay(WRITE_DELAY);

  pthread_mutex_unlock(&loc);

 }

 int pos(const elements e) {

  int n = 0;

  pthread_mutex_lock(&loc);

  for (list<element>::iterator i = begin(); i != end(); i++, n++)

   if (*i == e) {

    delay(READ_DELAY);

    break;

   }

  pthread_mutex_unlock(&loc);

  if (n == size()) n = -1;

  return n;

 }

} data;

А Π² Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ†ΠΈΠΊΠ» запросов ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ Π²:

pthread_t *h = new pthread_t[n];

uint64_t t = ClockCycles();

for (int i = 0; i < n; i++) {

 element e = erand(n);

 pthread_create(h + i, NULL, wrand(p) ? add : pos, (void*)e);

}

for (int i = 0; i < n; i++)

 pthread_join(h[i], NULL);

t = ((ClockCycles() - t) * 1000000000) / cps;

delete h;

А ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ этим Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΠΊΠ°ΠΊ:

static void* add(void* par) { data.add((element)par); }

static void* pos(void* par) { data.pos((element)par); }

Π‘ΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ СстСствСнно, Ρ‡Ρ‚ΠΎ список элСмСнтов, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ (ΠΈ ΠΊΡƒΠ΄Π° ΠΈΠ·Ρ€Π΅Π΄ΠΊΠ° ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π½ΠΎΠ²Ρ‹Π΅), Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Ρ‰ΠΈΡ‰Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€ΠΈ считывании (Π²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ ΠΈΡ… ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ «со стороны»). ΠŸΠΎΠ½ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π² прСдставлСнном Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ΠΌΡ‹ чСрСсчур ΠΏΠ΅Ρ€Π΅ΡΡ‚Ρ€Π°Ρ…ΠΎΠ²Π°Π»ΠΈΡΡŒ: Π²ΠΎ врСмя считывания ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Ρ‰ΠΈΡ‰Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Π½ΠΎ Π½Π΅Ρ‚ нСобходимости Π·Π°Ρ‰ΠΈΡ‰Π°Ρ‚ΡŒ структуру Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ считывания. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ структуру Π΄Π°Π½Π½Ρ‹Ρ… (Ρ„Π°ΠΉΠ» sy12.cc), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ чтСния/записи, оставив всС ΠΏΡ€ΠΎΡ‡Π΅Π΅ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ:

class dbase : public list<element> {

 static const int READ_DELAY = 1, WRITE_DELAY = 2;

 pthread_rwlock_t loc;

public:

 dbase(void) { pthread_rwlock_init(&loc, NULL); }

 ~dbase(void) { pthread_rwlock_destroy(&loc); }

 void add(const elements e) {

  pthread_rwlock_wrlock(&loc);

  int pos = size() * rand() / RAND_MAX;

  list<element>::iterator p = begin();

  for (int i = 0; i < pos; i++) p++;

  insert(p, e);

  delay(WRITE_DELAY);

  pthread_rwlock_unlock(&loc);

 }

 int pos(const elements e) {

  int n = 0;

  pthread_rwlock_rdlock(&loc);

  for (list<element>::iterator i = begin(); i != end(); i++, n++)

   if (*i == e) {

    delay(READ_DELAY);

    break;

   }

  pthread_rwlock_unlock(&loc);

  if (n == size()) n = -1;

  return n;

 }

} data;

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈΡˆΠ»ΠΎ врСмя ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹:

# nice -n-19 sy10 500 .2

evaluation time: 1.2296 sec.