Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
22 / 22 / 10
Регистрация: 19.03.2015
Сообщений: 137

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

19.04.2016, 13:56. Показов 6964. Ответов 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(); //все ок.
}
2
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.04.2016, 13:56
Ответы с готовыми решениями:

вывод на один график несколько функций
ребят поясните плз! как вывести 2 массива на один график ??? точки каждого желательно разным цветом :) y = wavread('D:\3_3s.wav'); ...

Как записывать несколько одномерных массивов, и несколько двумерных массивов в один единственный текстовый файл
Как записывать несколько одномерных массивов, и несколько двумерных массивов в один единственный текстовый файл? Что-то не видел других...

Несколько функций в IF
День добрый.Есть код: &lt;?php if (mail(&quot;nobody@example.com&quot;, &quot;the subject&quot;, &quot;Example message&quot;, &quot;From: webmaster@example.com...

50
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
21.04.2016, 19:07
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от nmcf Посмотреть сообщение
И на сколько он должен быть свободен
Почти всегда (пусть будет 90% времени). Рассмотрим 2 потока для простоты. Один захватил мьютекс, другой ждет. Когда первый освободил мьютекс, если ему он сразу нужен снова - значит в вашей программе в каждый момент времени может выполняться только один поток -> программа однопоточная - нахрена вам вообще мьютексы, перепишите ее в один поток - будет быстрее.
Цитата Сообщение от nmcf Посмотреть сообщение
чтобы потоки выполнялись равноправно.
Даешь всем потокам равные права независимо от вероисповедания!
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,307
21.04.2016, 19:08
Цитата Сообщение от nmcf Посмотреть сообщение
Без очереди будет бардак - одни оттеснят других.
Совершенно верно. Именно бардак, т.е. совершенно непредсказуемая очередность захвата мьютекса. Именно такой бардак и является высшей формой справедливости в многопоточной среде - ни один из равнозначных по приоритету потоков не должен обладать какими-то преимуществами над другими потоками. Победитель в борьбе за мьютекс должен выбираться случайно и непредсказуемо, т.е. должен иметь место именно бардак.
1
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.04.2016, 19:34
Цитата Сообщение от avgoor Посмотреть сообщение
если ему он сразу нужен снова
А если нагрузка непостоянна, или есть зависимость от обрабатываемых данных? Получается, что мьютекс в чистом виде применим только для идеальных условий, а в прочих случаях нужен напильник.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
21.04.2016, 19:41
Цитата Сообщение от nmcf Посмотреть сообщение
А если нагрузка непостоянна, или есть зависимость от обрабатываемых данных?
Когда FIFO для захвата мьютекса лучше "бардака"? Приведите пример, где это необходимо.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.04.2016, 19:51
Вот для этого случая, например:
Цитата Сообщение от avgoor Посмотреть сообщение
2) Если потоки равнозначны (читай делают одно и то же) - какая вам разница, какой поток захватит мьютекс?
Если предположить, что количество задач очень большое или даже бесконечное, то, условно говоря, заказчик дядя Вася будет ждать результатов неизвестно сколько, а Петька сразу и без очереди.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
21.04.2016, 20:00
Цитата Сообщение от nmcf Посмотреть сообщение
заказчик дядя Вася будет ждать результатов неизвестно сколько, а Петька сразу и без очереди.
Заказчик дядя Вася получит свой заказ когда надо, но интересно ли ему знать, что грузчик Гриша, который его обслуживал сделал это вместо грузчика Саши, чья очередь была?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,307
21.04.2016, 20:11
Цитата Сообщение от nmcf Посмотреть сообщение
Если предположить, что количество задач очень большое или даже бесконечное, то, условно говоря, заказчик дядя Вася будет ждать результатов неизвестно сколько, а Петька сразу и без очереди.
Ну это как лотерея: кто-то выиграл, а кто-то ничего не получил вообще. И кто купил билет раньше, а кто позже - роли не играет. Главное успеть купить билет до розыгрыша. И это нормально, если победитель выбирается справедливо, т.е. случайно.

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

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

А во-вторых, если приоритеты Васи и Пети равны, то какая разница, кто получит результат первым? Важно лишь то, что если потоки процесса не находится в состоянии deadlock-а, то какие-то потоки обязательно продвигаются вперед. Если Васин результат процессу важен, то в определенный момент другие потоки начнут залегать в спячку в ожидании этого результата, тем самым уменьшая конкуренцию и увеличивая шансы Васи на продвижение вперед (вплоть до того, что в спячку залягут все, кроме Васи).
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
21.04.2016, 20:14
nmcf, Еще раз. Если у вас в программе мьютекс постоянно кто-то ждет - у вас серьезные недостатки в архитектуре (кроме специфических случаев - когда мьютекс отражает не разделяемый ресурс, а нечто иное, скажем барьерную синхронизацию), и никакя очередь это не исправит.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.04.2016, 20:15
Цитата Сообщение от avgoor Посмотреть сообщение
Заказчик дядя Вася получит свой заказ когда надо, но интересно ли ему знать, что грузчик Гриша, который его обслуживал сделал это вместо грузчика Саши, чья очередь была?
Входные и выходные данные отличаются. Дядя Вася стоит в магазине, ему говорят - жди, не привезли, а Петька с чёрного хода по блату хватает - вот так без FIFO будет.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Другое дело, если окажется, что Петя все время уверенно выигрывает в лотерее.
Вот именно. Не известно, как работает планировщик, как там кванты времени распределяются и как это вообще реализовано. Может, при определённом стечении обстоятельств - размера данных, затрачиваемого времени и прочего Петя будет выигрывать в 99% случаев. Мьютекс слишком абстрактный.
0
27 / 26 / 6
Регистрация: 02.02.2014
Сообщений: 96
21.04.2016, 20:29
Берем queuing_mutex из TBB и насаждаем справедливость промеж потоков. Вот только скорее всего тут же окажется что проблема не в fair/unfair mutex-ах, а в архитектуре.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
21.04.2016, 20:31
Цитата Сообщение от nmcf Посмотреть сообщение
Может, при определённом стечении обстоятельств - размера данных, затрачиваемого времени и прочего Петя будет выигрывать в 99% случаев.
При определенном коде и deadlock возможен.
Рассмотрим пример. Отправка данных по медленному каналу. Можно сделать так: под мьютексом захватываем канал и пишем в него. Т.к. этот канал - узкое место он должен простаивать наименьшее кол-во времени. Поэтому мьютекс получает первый свободый поток. И если заказчик дядя Вася - тормоз - хорошо, что он не получит канал в порядке очереди, т.к. общее время в этом случае увеличится.
А теперь как это надо организовать. Под мьютексом получаем очередь, добавляем в нее себя, освобождаем мьютекс. Другой поток монопольно складывает в канал данные из очереди. Все! Мьютекс свободен 99% времени.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.04.2016, 20:31

несколько функций
как сделать несколько например OnMauseMuve для компонента???

Реализовать несколько функций
Реализовать несколько функций с различным числом аргументов и типами значений,что возвращаются, можно выбрать предложенные или произвольные...

Добавить несколько функций
привет всем) вот есть код на С++ в консольном приложении VS 2008 - калькулятор с функциями сложения, вычитания, умножения и деления....

Несколько функций поток
Доброго времени суток! Пишу файловый менеджер, в нём есть поток, который выполняет несколько функций, а именно копирует, удаляет,...

Несколько примеров функций
1) Приведите пример функции, которая не имеет второй производной в точке х=1, а первая производная в этой точке конечна. 2) Приведите...


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

Или воспользуйтесь поиском по форуму:
51
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru