Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Bushmeister
22 / 22 / 6
Регистрация: 19.03.2015
Сообщений: 137
#1

Один mutex на несколько функций - C++

19.04.2016, 13:56. Просмотров 852. Ответов 50
Метки нет (Все метки)

Есть три функции, которые могут работать с одним вектором в одно и то же время из разных потоков. Можно ли использовать один мьютекс на эти несколько функций, чтобы не синхронизировать работу 3-х мьютексов?
Код чисто для примера, чтобы было понятно, чего я хочу
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
mutex m;
vector<int> vec;
 
void Add(int i)
{
    m.lock();
        try
        {
            vec.push_back(i);
        }
        catch(exception ex)
        {
            m.unlock();
            throw ex;
        }
    m.unlock(); //все ок.
}
 
void Remove(int i)
{
    m.lock()
        try
        {
            //находим с помощью итераторов индекс с значением i и erasим его
            ...
        }
        catch(exception ex)
        {
            //если произойдет ошибка, анлокним мьютекс, чтобы другие функции могли
            //продолжить работу, а ошибку пробросим выше.
            m.unlock();
            throw ex;
        }
    m.unlock(); //все ок.
}
 
void Read(int index)
{
    m.lock()
        try
        {
            for (int i=0; i<vec.size(); i++)
            {
                if (i==index)
                {
                    vec[i].....
                    //шаманим со значением по индексу...
                }
            }
        }
        catch(exception ex)
        {
            m.unlock();
            throw ex;
        }
    m.unlock(); //все ок.
}
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
avgoor
883 / 518 / 111
Регистрация: 05.12.2015
Сообщений: 1,464
21.04.2016, 19:07     Один mutex на несколько функций #41
Цитата Сообщение от nmcf Посмотреть сообщение
И на сколько он должен быть свободен
Почти всегда (пусть будет 90% времени). Рассмотрим 2 потока для простоты. Один захватил мьютекс, другой ждет. Когда первый освободил мьютекс, если ему он сразу нужен снова - значит в вашей программе в каждый момент времени может выполняться только один поток -> программа однопоточная - нахрена вам вообще мьютексы, перепишите ее в один поток - будет быстрее.
Цитата Сообщение от nmcf Посмотреть сообщение
чтобы потоки выполнялись равноправно.
Даешь всем потокам равные права независимо от вероисповедания!
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3620 / 1895 / 502
Регистрация: 18.10.2014
Сообщений: 3,458
21.04.2016, 19:08     Один mutex на несколько функций #42
Цитата Сообщение от nmcf Посмотреть сообщение
Без очереди будет бардак - одни оттеснят других.
Совершенно верно. Именно бардак, т.е. совершенно непредсказуемая очередность захвата мьютекса. Именно такой бардак и является высшей формой справедливости в многопоточной среде - ни один из равнозначных по приоритету потоков не должен обладать какими-то преимуществами над другими потоками. Победитель в борьбе за мьютекс должен выбираться случайно и непредсказуемо, т.е. должен иметь место именно бардак.
nmcf
4944 / 4282 / 1431
Регистрация: 14.04.2014
Сообщений: 16,807
21.04.2016, 19:34     Один mutex на несколько функций #43
Цитата Сообщение от avgoor Посмотреть сообщение
если ему он сразу нужен снова
А если нагрузка непостоянна, или есть зависимость от обрабатываемых данных? Получается, что мьютекс в чистом виде применим только для идеальных условий, а в прочих случаях нужен напильник.
avgoor
883 / 518 / 111
Регистрация: 05.12.2015
Сообщений: 1,464
21.04.2016, 19:41     Один mutex на несколько функций #44
Цитата Сообщение от nmcf Посмотреть сообщение
А если нагрузка непостоянна, или есть зависимость от обрабатываемых данных?
Когда FIFO для захвата мьютекса лучше "бардака"? Приведите пример, где это необходимо.
nmcf
4944 / 4282 / 1431
Регистрация: 14.04.2014
Сообщений: 16,807
21.04.2016, 19:51     Один mutex на несколько функций #45
Вот для этого случая, например:
Цитата Сообщение от avgoor Посмотреть сообщение
2) Если потоки равнозначны (читай делают одно и то же) - какая вам разница, какой поток захватит мьютекс?
Если предположить, что количество задач очень большое или даже бесконечное, то, условно говоря, заказчик дядя Вася будет ждать результатов неизвестно сколько, а Петька сразу и без очереди.
avgoor
883 / 518 / 111
Регистрация: 05.12.2015
Сообщений: 1,464
21.04.2016, 20:00     Один mutex на несколько функций #46
Цитата Сообщение от nmcf Посмотреть сообщение
заказчик дядя Вася будет ждать результатов неизвестно сколько, а Петька сразу и без очереди.
Заказчик дядя Вася получит свой заказ когда надо, но интересно ли ему знать, что грузчик Гриша, который его обслуживал сделал это вместо грузчика Саши, чья очередь была?
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3620 / 1895 / 502
Регистрация: 18.10.2014
Сообщений: 3,458
21.04.2016, 20:11     Один mutex на несколько функций #47
Цитата Сообщение от nmcf Посмотреть сообщение
Если предположить, что количество задач очень большое или даже бесконечное, то, условно говоря, заказчик дядя Вася будет ждать результатов неизвестно сколько, а Петька сразу и без очереди.
Ну это как лотерея: кто-то выиграл, а кто-то ничего не получил вообще. И кто купил билет раньше, а кто позже - роли не играет. Главное успеть купить билет до розыгрыша. И это нормально, если победитель выбирается справедливо, т.е. случайно.

Другое дело, если окажется, что Петя все время уверенно выигрывает в лотерее. Тогда становится понятно, что дело тут нечисто.

Это во-первых.

А во-вторых, если приоритеты Васи и Пети равны, то какая разница, кто получит результат первым? Важно лишь то, что если потоки процесса не находится в состоянии deadlock-а, то какие-то потоки обязательно продвигаются вперед. Если Васин результат процессу важен, то в определенный момент другие потоки начнут залегать в спячку в ожидании этого результата, тем самым уменьшая конкуренцию и увеличивая шансы Васи на продвижение вперед (вплоть до того, что в спячку залягут все, кроме Васи).
avgoor
883 / 518 / 111
Регистрация: 05.12.2015
Сообщений: 1,464
21.04.2016, 20:14     Один mutex на несколько функций #48
nmcf, Еще раз. Если у вас в программе мьютекс постоянно кто-то ждет - у вас серьезные недостатки в архитектуре (кроме специфических случаев - когда мьютекс отражает не разделяемый ресурс, а нечто иное, скажем барьерную синхронизацию), и никакя очередь это не исправит.
nmcf
4944 / 4282 / 1431
Регистрация: 14.04.2014
Сообщений: 16,807
21.04.2016, 20:15     Один mutex на несколько функций #49
Цитата Сообщение от avgoor Посмотреть сообщение
Заказчик дядя Вася получит свой заказ когда надо, но интересно ли ему знать, что грузчик Гриша, который его обслуживал сделал это вместо грузчика Саши, чья очередь была?
Входные и выходные данные отличаются. Дядя Вася стоит в магазине, ему говорят - жди, не привезли, а Петька с чёрного хода по блату хватает - вот так без FIFO будет.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Другое дело, если окажется, что Петя все время уверенно выигрывает в лотерее.
Вот именно. Не известно, как работает планировщик, как там кванты времени распределяются и как это вообще реализовано. Может, при определённом стечении обстоятельств - размера данных, затрачиваемого времени и прочего Петя будет выигрывать в 99% случаев. Мьютекс слишком абстрактный.
warhast
11 / 11 / 3
Регистрация: 02.02.2014
Сообщений: 55
21.04.2016, 20:29     Один mutex на несколько функций #50
Берем queuing_mutex из TBB и насаждаем справедливость промеж потоков. Вот только скорее всего тут же окажется что проблема не в fair/unfair mutex-ах, а в архитектуре.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2016, 20:31     Один mutex на несколько функций
Еще ссылки по теме:

Слить несколько txt-файлов в один C++
C++ Насколько целесообразно разбивать программу на несколько функций?
Несколько new на один и тот же указатель C++
Реализовать несколько функций C++
Создание матрицы и сортировка, используя несколько функций C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
avgoor
883 / 518 / 111
Регистрация: 05.12.2015
Сообщений: 1,464
21.04.2016, 20:31     Один mutex на несколько функций #51
Цитата Сообщение от nmcf Посмотреть сообщение
Может, при определённом стечении обстоятельств - размера данных, затрачиваемого времени и прочего Петя будет выигрывать в 99% случаев.
При определенном коде и deadlock возможен.
Рассмотрим пример. Отправка данных по медленному каналу. Можно сделать так: под мьютексом захватываем канал и пишем в него. Т.к. этот канал - узкое место он должен простаивать наименьшее кол-во времени. Поэтому мьютекс получает первый свободый поток. И если заказчик дядя Вася - тормоз - хорошо, что он не получит канал в порядке очереди, т.к. общее время в этом случае увеличится.
А теперь как это надо организовать. Под мьютексом получаем очередь, добавляем в нее себя, освобождаем мьютекс. Другой поток монопольно складывает в канал данные из очереди. Все! Мьютекс свободен 99% времени.
Yandex
Объявления
21.04.2016, 20:31     Один mutex на несколько функций
Ответ Создать тему
Опции темы

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