Форум программистов, компьютерный форум, киберфорум
Наши страницы
Boost C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Avazart
Эксперт С++
7683 / 5592 / 543
Регистрация: 10.12.2010
Сообщений: 25,073
Записей в блоге: 17
#1

shared_lock и upgrade_lock - Boost C++

12.01.2013, 03:37. Просмотров 1794. Ответов 6
Метки нет (Все метки)

Пока никак не могу найти толкового примера демонстрирующего возможности данных видов блокировок.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
12.01.2013, 19:34 #2
Avazart, это реализации модели "много читателей/один писатель".
0
Avazart
Эксперт С++
7683 / 5592 / 543
Регистрация: 10.12.2010
Сообщений: 25,073
Записей в блоге: 17
12.01.2013, 19:36  [ТС] #3
Цитата Сообщение от fasked Посмотреть сообщение
Avazart, это реализации модели "много читателей/один писатель".
Да я понял из доки ...
А вот примеров там ноль...
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
12.01.2013, 19:39 #4
Avazart, если сама модель понятна, то пример тут и не нужен. Он мало от обычной эксклюзивной блокировки будет отличаться, разве что типами mutex/lock_guard.
1
Avazart
Эксперт С++
7683 / 5592 / 543
Регистрация: 10.12.2010
Сообщений: 25,073
Записей в блоге: 17
12.01.2013, 22:37  [ТС] #5
К примеру как будет выглядеть такая задача:

Один пишущий поток заполняет вектор целыми числами 0...N, а два читающих записывают эти числа в другие вектора(или к примеру в stringstream) - один поток четные элементы, второй- нечетные.

Добавлено через 1 минуту
Цитата Сообщение от fasked Посмотреть сообщение
Avazart, если сама модель понятна, то пример тут и не нужен. Он мало от обычной эксклюзивной блокировки будет отличаться, разве что типами mutex/lock_guard.
Ну так как отделить писателя от читателей в чем тут будет разница ?

Добавлено через 2 часа 54 минуты
Как я понял вроде как-то так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
 
#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
 
const size_t size = 100;
//---------------------------------------------------------------------------
void writer(boost::shared_mutex& mutex,std::vector<int>& viout)
{
  for(size_t i=0; i<size ; i++)
    {
      boost::unique_lock<boost::shared_mutex> mylock(mutex);
      viout.push_back(i);
    }  
}
//----------------------------------------------------------------------------
void reader(boost::shared_mutex& mutex,const std::vector<int>& viin,std::vector<int>& viout,bool even)
{
  for(size_t i= 0; ; ) // Если не дошли до конца тупо крутимся в цикле 
    {
      boost::shared_lock<boost::shared_mutex> mylock(mutex);
 
      if( i<viin.size() ) 
        {
          if( viin[i]%2 != even) viout.push_back(viin[i]); 
          i++; 
        }
      if( viin.size()==size && i==size ) break; 
    }  
}
//---------------------------------------------------------------------------
int main()
{
  boost::shared_mutex mutex;
 
  std::vector<int> vi;
 
  std::vector<int> vi1;
  std::vector<int> vi2; 
  //-
  boost::thread my_thread(boost::bind(&writer, boost::ref(mutex),boost::ref(vi) ) );
 
  boost::thread my_thread1(boost::bind(&reader, boost::ref(mutex),boost::ref(vi),boost::ref(vi1), true ) );
  boost::thread my_thread2(boost::bind(&reader, boost::ref(mutex),boost::ref(vi),boost::ref(vi2), false) );
 
  my_thread.join();
  my_thread1.join();
  my_thread2.join();
 
  // Вывод
  std::copy(vi.begin(),vi.end(),std::ostream_iterator<int>(std::cout,"\t") ); std::cout<<std::endl;
  std::copy(vi1.begin(),vi1.end(),std::ostream_iterator<int>(std::cout,"\t") ); std::cout<<std::endl;
  std::copy(vi2.begin(),vi2.end(),std::ostream_iterator<int>(std::cout,"\t") ); std::cout<<std::endl;
 
system("pause");
return 0;
}
//-------------------------------------------------------------------------------------------------------
1
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
12.01.2013, 23:38 #6
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Avazart Посмотреть сообщение
Ну так как отделить писателя от читателей в чем тут будет разница ?
Те, которые не изменяют состояние разделяемого ресурса - читатели, им необходимо предоставить shared_lock. Тот, который изменяет состояние ресурса - писатель, ему необходимо предоставить unique_lock. Поскольку писатель чаще всего и читает тоже, то используется upgrade_lock, который по сути то shared_lock, то unique_lock.
Цитата Сообщение от Avazart Посмотреть сообщение
Как я понял вроде как-то так:
Ну да, вроде того, только у тебя писатель сразу получает эксклюзивный доступ (потому что он только пишет). А если писатель еще и читает, то лучше будет сделать upgrade_lock и только в моменты записи повышать до unique_lock.
3
Avazart
Эксперт С++
7683 / 5592 / 543
Регистрация: 10.12.2010
Сообщений: 25,073
Записей в блоге: 17
12.01.2013, 23:40  [ТС] #7
Цитата Сообщение от fasked Посмотреть сообщение
Avazart, ну да, вроде того, только у тебя писатель сразу получает эксклюзивный доступ (потому что он только пишет). А если писатель еще и читает, то лучше будет сделать upgrade_lock и только в моменты записи повышать до unique_lock.
Это вроде понятно, но я пока до upgrade_lock не дошел... т.е пример старался сугубо под shared_lock написать...

А тупил из-за того что пытался обычный мютекс всунуть...
0
12.01.2013, 23:40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru