QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович
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;
Откройте для себя мир чтения на siteknig.com - месте, где каждая книга оживает прямо в браузере. Здесь вас уже ждёт произведение QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович, относящееся к жанру Интернет. Никаких регистраций, никаких преград - только вы и история, доступная в полном формате. Наш литературный портал создан для тех, кто любит комфорт: хотите читать с телефона - пожалуйста; предпочитаете ноутбук - идеально! Все книги открываются моментально и представлены полностью, без сокращений и скрытых страниц. Каталог жанров поможет вам быстро найти что-то по настроению: увлекательный роман, динамичное фэнтези, глубокую классику или лёгкое чтение перед сном. Мы ежедневно расширяем библиотеку, добавляя новые произведения, чтобы вам всегда было что открыть "на потом". Сегодня на siteknig.com доступно более 200000 книг - и каждая готова стать вашей новой любимой. Просто выбирайте, открывайте и наслаждайтесь чтением там, где вам удобно.


