Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

19.04.2016, 13:56. Просмотров 956. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2016, 13:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Один mutex на несколько функций (C++):

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

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

Разбить на несколько функций - C++
Доброго времени суток, подскажите пожалуйста, нужно разбить одну большую функцию, на несколько. Вот исходные код с одной...

Нужно реализовать несколько функций - C++
// копирует source в destination и возвращает указатель на destination char* strcpy(char* destination, const char* source); //...

Несколько функций в одной программе - C++
Проблема такая. Пишу программу, хочу, чтобы при выборе определенного номера (задания) программа переходила к этому заданию. Напечатал на...

Несколько функций - активна только одна - C++
Вообщем есть несколько функций? int Fun1,Fun2,Fun3,Fun4; if(Fun1){Действие} if(Fun2){Действие} if(Fun3){Действие} ...

50
nmcf
5538 / 4848 / 1644
Регистрация: 14.04.2014
Сообщений: 19,670
21.04.2016, 14:31 #31
Цитата Сообщение от avgoor Посмотреть сообщение
А вообще, планировщик делают с оглядкой на такие вещи.
Ну и почему нет очереди тогда? Логично же передавать управление тому, кто дольше ждёт.
0
warhast
11 / 11 / 4
Регистрация: 02.02.2014
Сообщений: 59
21.04.2016, 15:06 #32
Логично потратить как можно меньше времени и разбудить первый попавшийся ждущий поток. Fair синхронизация нужна слишком редко, чтобы ради нее в ядро вкорячивать лишний код, тем более в таком месте.
0
nmcf
5538 / 4848 / 1644
Регистрация: 14.04.2014
Сообщений: 19,670
21.04.2016, 15:14 #33
Цитата Сообщение от warhast Посмотреть сообщение
потратить как можно меньше времени и разбудить первый попавшийся ждущий поток
Попавшийся где? Они же хранятся в каком-то контейнере, значит очерёдность там - не проблема.
0
avgoor
915 / 550 / 119
Регистрация: 05.12.2015
Сообщений: 1,531
21.04.2016, 17:06 #34
Цитата Сообщение от nmcf Посмотреть сообщение
Ну и почему нет очереди тогда? Логично же передавать управление тому, кто дольше ждёт.
Цитата Сообщение от nmcf Посмотреть сообщение
Попавшийся где? Они же хранятся в каком-то контейнере, значит очерёдность там - не проблема.
Там есть какая-то очередность, но она, в общем случае, не совпадает с FIFO, потому, что это никому не надо, TheCalligrapher уже объяснил почему. Если вам так нужна эта очередь, организуйте ее самостоятельно. Но учитывайте, что никак невозможно заранее определить порядок в котором потоки в эту очередь попадут.
0
warhast
11 / 11 / 4
Регистрация: 02.02.2014
Сообщений: 59
21.04.2016, 17:17 #35
Пример: поток освобождает мьютекс (лежащий за ним футекс) и будит ожидающего. Но в этот момент набегает новый поток и хватает освободившийся футекс. Проснувшийся ожидавший видит, что прощелкал свой шанс и засыпает обратно, причем уже в конце очереди. И вот такое проверять никто не будет без нужды.
0
avgoor
915 / 550 / 119
Регистрация: 05.12.2015
Сообщений: 1,531
21.04.2016, 17:17 #36
Поясню подробнее. Один поток может 10 раз успеть захватить и освободить мьютекс, пока второй доберется до захвата этого мьютекса, т.е. постановки в очередь.
0
nmcf
5538 / 4848 / 1644
Регистрация: 14.04.2014
Сообщений: 19,670
21.04.2016, 18:04 #37
Цитата Сообщение от warhast Посмотреть сообщение
поток освобождает мьютекс (лежащий за ним футекс) и будит ожидающего. Но в этот момент набегает новый поток и хватает освободившийся футекс.
Не понял я твой пример. Потоки активируются не сами собой, а извне. Если всё, как ты описал, то как вообще гарантировать хоть какую-то равномерность выполнения?
Цитата Сообщение от avgoor Посмотреть сообщение
Один поток может 10 раз успеть захватить и освободить мьютекс, пока второй доберется до захвата этого мьютекса
Я об этом и говорю. Без очереди будет бардак - одни оттеснят других.
0
avgoor
915 / 550 / 119
Регистрация: 05.12.2015
Сообщений: 1,531
21.04.2016, 18:23 #38
Цитата Сообщение от nmcf Посмотреть сообщение
Я об этом и говорю. Без очереди будет бардак - одни оттеснят других
1) Мьютекс почти всегда свободен. Потому, что если он почти всегда занят - практически вы имеете однопоточный алгоритм с оверхедом в виде потоков.
2) Если потоки равнозначны (читай делают одно и то же) - какая вам разница, какой поток захватит мьютекс?
3) Если потоки не равнозначны - какая разница, какой из них первым попытался захатить мьютекс, если все равно нужен приоритет?
Исходя из вышесказанного зачем нужна строгая очередность в захвате мьютексов?

Добавлено через 8 минут
Цитата Сообщение от nmcf Посмотреть сообщение
Без очереди будет бардак - одни оттеснят других
Но мьютексы к этому не имеют никакого отношения.
0
warhast
11 / 11 / 4
Регистрация: 02.02.2014
Сообщений: 59
21.04.2016, 18:27 #39
О какой именно "равномерности" речь?
0
nmcf
5538 / 4848 / 1644
Регистрация: 14.04.2014
Сообщений: 19,670
21.04.2016, 18:50 #40
Цитата Сообщение от avgoor Посмотреть сообщение
Мьютекс почти всегда свободен
Откуда это следует? И на сколько он должен быть свободен, чтобы гарантировать захват всеми желающими, на секунду, на минуту?
Цитата Сообщение от avgoor Посмотреть сообщение
Исходя из вышесказанного зачем нужна строгая очередность в захвате мьютексов?
Я уже сказал - в первую очередь, чтобы потоки выполнялись равноправно.

Добавлено через 2 минуты
Цитата Сообщение от warhast Посмотреть сообщение
О какой именно "равномерности" речь?
О равномерном выполнении всех потоков. Чтобы все получали шанс и время, а не находились в состоянии ожидания, пока кто-то вне очереди перехватывает мьютекс.
0
avgoor
915 / 550 / 119
Регистрация: 05.12.2015
Сообщений: 1,531
21.04.2016, 19:07 #41
Цитата Сообщение от nmcf Посмотреть сообщение
И на сколько он должен быть свободен
Почти всегда (пусть будет 90% времени). Рассмотрим 2 потока для простоты. Один захватил мьютекс, другой ждет. Когда первый освободил мьютекс, если ему он сразу нужен снова - значит в вашей программе в каждый момент времени может выполняться только один поток -> программа однопоточная - нахрена вам вообще мьютексы, перепишите ее в один поток - будет быстрее.
Цитата Сообщение от nmcf Посмотреть сообщение
чтобы потоки выполнялись равноправно.
Даешь всем потокам равные права независимо от вероисповедания!
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3945 / 2169 / 553
Регистрация: 18.10.2014
Сообщений: 3,783
21.04.2016, 19:08 #42
Цитата Сообщение от nmcf Посмотреть сообщение
Без очереди будет бардак - одни оттеснят других.
Совершенно верно. Именно бардак, т.е. совершенно непредсказуемая очередность захвата мьютекса. Именно такой бардак и является высшей формой справедливости в многопоточной среде - ни один из равнозначных по приоритету потоков не должен обладать какими-то преимуществами над другими потоками. Победитель в борьбе за мьютекс должен выбираться случайно и непредсказуемо, т.е. должен иметь место именно бардак.
0
nmcf
5538 / 4848 / 1644
Регистрация: 14.04.2014
Сообщений: 19,670
21.04.2016, 19:34 #43
Цитата Сообщение от avgoor Посмотреть сообщение
если ему он сразу нужен снова
А если нагрузка непостоянна, или есть зависимость от обрабатываемых данных? Получается, что мьютекс в чистом виде применим только для идеальных условий, а в прочих случаях нужен напильник.
0
avgoor
915 / 550 / 119
Регистрация: 05.12.2015
Сообщений: 1,531
21.04.2016, 19:41 #44
Цитата Сообщение от nmcf Посмотреть сообщение
А если нагрузка непостоянна, или есть зависимость от обрабатываемых данных?
Когда FIFO для захвата мьютекса лучше "бардака"? Приведите пример, где это необходимо.
0
nmcf
5538 / 4848 / 1644
Регистрация: 14.04.2014
Сообщений: 19,670
21.04.2016, 19:51 #45
Вот для этого случая, например:
Цитата Сообщение от avgoor Посмотреть сообщение
2) Если потоки равнозначны (читай делают одно и то же) - какая вам разница, какой поток захватит мьютекс?
Если предположить, что количество задач очень большое или даже бесконечное, то, условно говоря, заказчик дядя Вася будет ждать результатов неизвестно сколько, а Петька сразу и без очереди.
0
21.04.2016, 19:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2016, 19:51
Привет! Вот еще темы с ответами:

Объединить несколько циклов в один - C++
Здравствуйте! Соорудил небольшую систему для прохода по одномерному массиву с целью выдергивания последнего члена в цепочке...

Заменить один символ на несколько - C++
Добрый день, у меня вопрос по С++. Как сделать что бы в чаре менял 1 символ на несколько? Не могу постичь этого. И ещё как мне заменять...

Несколько new на один и тот же указатель - C++
char* p; p = new char; strcpy(p, &quot;june&quot;); cout &lt;&lt; p &lt;&lt; endl; p = new char; strcpy(p, &quot;august&quot;); cout &lt;&lt; p &lt;&lt; endl; p = new...

Создание матрицы и сортировка, используя несколько функций - C++
Доброго времени суток, всем пользователям. Нуждаюсь в помощи, имею код, в котором лишь используется 1 функция int main (); Но согласно...


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

Или воспользуйтесь поиском по форуму:
45
Ответ Создать тему
Опции темы

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