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

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

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

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;