![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| REZiaMIX |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: нет Всего: 4 |
Исходя из старой моей темы:
Положение дел: Есть массив элементов(кол-во от 0 до 20000). Необходимо организовать потокобезопасные операции с этим массивом:
Хочу такой класс:
Какие стратегии применять при синхронизации? Начал писать такой класс на основе std::vector и наткнулся на следующие траблы:
Добавлено через 6 минут и 5 секунд + доступ возможен из нескольких потоков -------------------- ![]() |
||||||
|
|||||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
тебе нужно разграничение блокировки. гугли RW-lock.
|
|||
|
||||
| REZiaMIX |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: нет Всего: 4 |
Почитал, как понял при такой блокировке может быть только 1 writer, или не так?. У меня же врайтеров может быть много. -------------------- ![]() |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
нет. writer`ов может быть несколько, но для твоего случая это не подходит. посему, один writer и много reader`ов. это лучше чем один reader-writer.
|
|||
|
||||
| REZiaMIX |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: нет Всего: 4 |
а почему для меня не подходит много врайтеров? -------------------- ![]() |
|||
|
||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 8 Всего: 39 |
REZiaMIX, используйте список или chain vector, что даже лучше. Пока пишите в одно место, блокируете только модифицируемый вектор (во втором случае) или только нынешний и соседние элементы (в первом). Аналогично с удалением. Доступ к size делайте в один поток для записи и много потоков для чтения.
Случайный доступ к элементам будет медленный, но если оптимизировать алгоритм доступа к элементу, то скорость последовательного будет лишь немного уступать обычному vector-у. Добавлено через 2 минуты и 26 секунд chain vector - это нечто вроде списка небольших векторов. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| REZiaMIX |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: нет Всего: 4 |
Сам только что сидел думал, и придумал также) -------------------- ![]() |
|||
|
||||
| REZiaMIX |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: нет Всего: 4 |
Написал на коленке класс "кусок того самого chain vector". Словил дедлок, помогите найти ошибку в синхронизации.
.h
.cpp
-------------------- ![]() |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Ошибок не видно. Где возникает дедлок?
|
|||
|
||||
| REZiaMIX |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: нет Всего: 4 |
Щас начал глубоко разбираться - ошибки есть. Дедлок при вызове size(); -------------------- ![]() |
|||
|
||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 8 Всего: 39 |
Хз, как у вас организован scopeLock, но предположу, что вызывается size() из уже залоченной области, что и дедлочит программу.
Добавлено через 1 минуту и 3 секунды Вероятно вы используете мутексы. Тут намного лучше использовать семафоры. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| REZiaMIX |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: нет Всего: 4 |
Это я уже обнаружил, но там еще куча граблей. Уже запутался. Я эмулирую крит. секции через мьютексы -------------------- ![]() |
|||
|
||||
| REZiaMIX |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: нет Всего: 4 |
scopeLock:
-------------------- ![]() |
||||
|
|||||
| REZiaMIX |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: нет Всего: 4 |
Очень тяжелая для головы задача. Дебажить трудно - в 1ном потоке все нормально, при нескольких ошибки(то дедлок, то наоборот магическим образом получаю доступ к уже заюзанному элементу).
-------------------- ![]() |
|||
|
||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 8 Всего: 39 |
Just use semaphore, Luke!
Добавлено через 2 минуты и 9 секунд Потому что мутексы тут не очень подходят, имхо. Добавлено через 2 минуты и 51 секунду Хотя согласен, после однопоточного программирования мозг не сразу переключается в параллелизм. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |