Бюджет: 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 день
Добрий день. Зможу зробити поставлену задачу швидко і якісно.