Бюджет: 1000 UAH Срок: 1 день
Добрый день. Смогу выполнить поставленную задачу быстро и качественно.
Реализуйте блокировку с различением читателей и записывателей, заполнив приведенный ниже шаблон файла rwlock.h:
#ifndef H_RWLOCK
#define H_RWLOCK
#include "futex.h"
#include "xlock.h"
#include "semaphore.h"
struct rwlock
{
static const int MAX_READERS = 1<<30;
void lockR()
{
}
void unlockR()
{
}
void lock()
{
}
void unlock()
{
}
};
#endif // H_RWLOCKМетоды lock() и unlock() закрывают и открывают блокировку в режиме записи, а lockR() и unlockR() — в режиме чтения. Блокировка должна гарантировать:
эксклюзивность доступа для записи: после вызова lock() все вызовы lock() и lockR() блокируют поток до вызова unlock().
совместный доступ для чтения: после вызова lockR() последующие вызовы lockR() не блокируют поток (но см. следующий пункт!).
невозможность «голодания» записывателя читателями: после вызова lockR() и (блокировочного) lock() последующие вызовы lockR() должны блокировать поток до момента, когда поток-записывающий вызовет unlock().
4. работа полностью в пространстве пользователя при отсутствии конфликтов: если на блокировку не претендует ни один записыватель, или ровно один записыватель и ни одного читателя, вызовы всех методов не должны обращаться к операционной системе.
Можно предположить, что вызовы lock() и unlock(), а также lockR() и unlockR() будут соответственно спарованы в пределах потоков, не будут использоваться рекурсивно, а количество потоков, которые одновременно удерживают блокировку в режиме чтения, не превысит 2^30.
Кроме стандартных заголовков C++17, можно использовать файлы futex.h, xlock.h и semaphore.h, которые содержат соответственно реализации футекса, исключительного блокирования (аналог <mutex>, но с гарантией отсутствия лишних системных вызовов) и неограниченного семафора.
Бюджет: 1000 UAH Срок: 1 день
Добрый день. Смогу выполнить поставленную задачу быстро и качественно.