EDEADLK
EFAULTrwl
EINVALrwlΠ€ΡΠ½ΠΊΡΠΈΡ
pthread_rwlock_timedwrlock()
EOK
EAGAIN
EDEADLK
EINVALrwl
ETIMEDOUTΠΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ
int pthread_rwlock_unlock(pthread_rwlock_t* rwl);Π€ΡΠ½ΠΊΡΠΈΡ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ Π·Π°Ρ Π²Π°ΡΠ΅Π½Π½ΡΠΉ Π»ΡΠ±ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ/Π·Π°ΠΏΠΈΡΠΈ. ΠΡΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ Π±ΡΠ» Π·Π°Ρ Π²Π°ΡΠ΅Π½ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ (Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΏΠΎ ΡΡΠ΅Π½ΠΈΡ), ΡΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΅Π³ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠ°Π²Π½ΡΡΡΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Ρ Π·Π°Ρ Π²Π°ΡΠΎΠ².
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ:
EOK
EAGAINPTHREAD_RWLOCK_INITIALIZER
EFAULTrwl
EINVALrwl
EPERMrwlΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ ΡΡΠ΅Π½ΠΈΡ/Π·Π°ΠΏΠΈΡΠΈ
ΠΠΎΡΡΡΠΎΠΈΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ΅Π΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΡΡΠ΅Π½ΠΈΡ/Π·Π°ΠΏΠΈΡΠΈ ( ΡΠ°ΠΉΠ» 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;