crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> множественное чтение и единичная запись через мьютексы, shared_mutex, shared_lock, upgrade_lock
Mifodix
  опции профиля:
сообщение 27.5.2011, 22:25
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 7.6.2010
Пользователь №: 1789

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем доброго времени!
Чтобы проще описать мою проблему, рассмотрим следующую программу:
#include <boost/thread.hpp>
#include <list>
#include <iostream>

boost::shared_mutex shmutex;
std::list<int> l;

void thread_func_read(int num)
{
    //boost::shared_lock<boost::shared_mutex> readLock(shmutex);
        std::cout<<"Thread read "<<num<< " Data: ";
    for (std::list<int>::iterator it=l.begin(); it!=l.end(); ++it)
    {
        std::cout<<*it<<" ";
    }
    std::cout<<std::endl;
    sleep(5);
}

void thread_func_write(int num)
{
    std::cout<<"Thread write "<<num<< " Data: ";
    l.push_front(100);
    std::cout<<std::endl;
    sleep(5);
}

int main()
{
    boost::thread_group thrds;
    l.push_back(10);
    l.push_back(20);
    l.push_back(30);
    l.push_back(40);
    thrds.add_thread(new boost::thread(thread_func_read, 1));
    thrds.add_thread(new boost::thread(thread_func_read, 2));
    thrds.add_thread(new boost::thread(thread_func_read, 3));
    thrds.add_thread(new boost::thread(thread_func_write, 4));
    thrds.add_thread(new boost::thread(thread_func_write, 5));
    thrds.join_all();
    return 0;
}

Необходимо как-то реализовать через мьютексы множественное чтение списка (т. е. все потоки, использующие thread_func_read могут одновременно читать) и единичную запись (т. е. только один поток в настоящее время может производить запись в список). При этом запись в список должна быть возможна только после завершения чтения этого списка другими потоками, а само чтение невозможно, если в список производится запись. Несколько потоков не могут писать одновременно.
С первой часть всё понятно: нужно использовать shared_lock. А вот как быть с ограничением на запись?
Заранее спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 20.6.2025, 2:06