Читати книгу C

ЗМІСТ.

ЗМІСТ

Використання м'ютексу дозволяє зробити всю роботу, проте хочеться трохи більшого. При такому підході немає різниці між читанням і записом, що істотно, оскільки неефективно змушувати потоки чекати у черзі доступу до ресурсу, коли з них виконують лише операції читання, котрим не потрібно монопольний доступ. Для цього в бібліотеці Boost Threads передбачено клас read_write_mutex. Приклад 12.3 показує, як можна реалізувати приклад 12.2, використовуючи read_write_mutex з функцією-членом front , яка дозволяє програмі отримати копію першого елемента черги без його виштовхування.

Приклад 12.3. Використання м'ютексу читання/запису

Queue() : // Використовувати м'ютекс читання/запису та надати йому пріоритет

rwMutex_(boost::read_write_scheduling_policy::writer_priority) <>

void enqueue(const T&x)

// Використовувати блокування читання/запису, оскільки enqueue

boost::read_write_mutex::scoped_write_lock writeLock (rwMutex_);

// Знову використати блокування для запису

boost::read_write_mutex::scoped_write_lock writeLock (rwMutex_);

Ttmp = list_.front();

// Це операція читання, тому потрібне блокування лише читання

boost::read_write_mutex::scoped_read_lock.readLock (rwMutex_);

boost::read_write_mutex rwMutex_;

Тут слід зазначити кілька моментів. Зверніть увагу, що тепер я використовую read_write_mutex.

При використанні м'ютексів читання/запису блокування теж виконуються інакше. У прикладі 12.3, коли мені потрібно заблокувати Queue для запису, я створюю об'єкт класу scoped_write_lock .

А коли мені простопотрібно прочитати Queue, я використовую scoped_read_lock.

Блокування читання/запису зручні, але вони не захищають вас від серйозних помилок. На етапі компіляції робиться перевірка ресурсу, представленого мьютексом rwMutex_ , що гарантує відсутність зміни ресурсу при блокуванні лише читання. Ви самі повинні подбати про те, щоб потік міг модифікувати стан об'єкта тільки при блокуванні для запису, оскільки компілятор не робитиме.

Точна послідовність виконання блокувань визначається політикою їхнього планування; цю політику ви задає при конструюванні об'єкта mutex. У бібліотеці Boost Threads передбачається чотири політики.