Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/14: Рейтинг темы: голосов - 14, средняя оценка - 5.00
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1

boost::mutex взаимоблокировки

30.05.2013, 14:09. Показов 2975. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Псевдокод:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void SomeClass::someMethod_1()
{
    boost::mutex::scoped_lock lock( someMutex ); // someMutex - член класса
    // тело ф-ции
}
 
void SomeClass::someMethod_2()
{
    boost::mutex::scoped_lock lock( someMutex ); // someMutex - член класса
    // тело ф-ции
}
 
void SomeClass::someMethod_3()
{
    boost::mutex::scoped_lock lock( someMutex ); // someMutex - член класса
    
    someMethod_1();
    // тело ф-ции
}
Все методы дергаются отдельными потоками.
Из приведенного видно, что someMethod_3 лочит мьютех и дергает someMethod_1, который в свою очередь тоже пытается этот же мьютех залочить. В результате получаем зависание проги.

Пока проект небольшой еще можно подобные косяки отловить визуально, но если проект разрастается, то не всегда логированием это отловишь.
Есть ли какие нибудь средства, что бы гарантировано не залочить взаимно, при подобной ситуации?
PS: timed_mutex мне кажется немного через зад будет.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.05.2013, 14:09
Ответы с готовыми решениями:

Boost начало работы: Undefined reference to `boost::system::generic_category() '
Добрый день Собственно говоря возникла необходимость использовать boost в работе. Поставил так: sudo apt-get install boostlib-all-dev ...

Boost Log - undefined reference to `boost::system::system_category()'
Пытаюсь скомпилировать код из примеров Boost Log:#include <boost/log/trivial.hpp> int main(int, char*) { ...

Использование boost и boost.build с несколькими компиляторами
Здравствуйте! Собрал библиотеку boost и boost.build для двух компиляторов: MinGW 4.5.2 и Visual C++ 2010 Express Edition. Для этого...

3
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.05.2013, 14:25
oxotnik, try_lock, recursive_mutex.
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
30.05.2013, 14:29  [ТС]
Цитата Сообщение от ForEveR Посмотреть сообщение
try_lock, recursive_mutex.
быбл бы благодарен примеру из псевдокода, с теми условиями, что лочить надо обязательно, и отрабатывать ф-я должна все свое тело, а не делать ретурн после неудачной блокировки.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.05.2013, 14:46
oxotnik, recursive_mutex тогда полагаю.
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
#include <boost/thread.hpp>
#include <iostream>
 
void sync_print(const std::string& action, const std::string& method)
{
   static boost::mutex io;
   io.lock();
   std::cout << action << " in: " << method << " " << boost::this_thread::get_id() << std::endl;
   io.unlock();
}
 
template<typename T>
class LockGuard
{
public:
   LockGuard(T& mutex, const std::string& m) : method(m)
   {
      lock = typename T::scoped_lock(mutex);
      sync_print("Locked", m);
   }
   ~LockGuard()
   {
      sync_print("Unlocked", method);
   }
private:
   std::string method;
   typename T::scoped_lock lock;
};
 
class MutexSample
{
public:
   void SomeMethod1()
   {
      LockGuard<boost::recursive_mutex> guard(mutex, "somemethod1");
   }
   void SomeMethod2()
   {
      LockGuard<boost::recursive_mutex> guard(mutex, "somemethod2");
      SomeMethod1();
   }
private:
   mutable boost::recursive_mutex mutex;
};
 
int main()
{
   MutexSample mutex;
   boost::thread thr1(&MutexSample::SomeMethod1, boost::ref(mutex));
   boost::thread thr2(&MutexSample::SomeMethod2, boost::ref(mutex));
   thr1.join();
   thr2.join();
}
Bash
1
2
3
4
5
6
7
./new
Locked in: somemethod2 0x8b3d240
Locked in: somemethod1 0x8b3d240
Unlocked in: somemethod1 0x8b3d240
Unlocked in: somemethod2 0x8b3d240
Locked in: somemethod1 0x8b3d078
Unlocked in: somemethod1 0x8b3d078
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.05.2013, 14:46
Помогаю со студенческими работами здесь

Метапрограммирование в boost::proto (boost::spirit)
В библиотеке boost:: proto есть такой код calculator&lt;proto::terminal&lt;placeholder&lt;0&gt; &gt;::type&gt; const _1; ...

Qt и boost boost::system::generic_category()
Добрый день Не подскажите как настроить Qt на работу с boost? У меня в принципе все работает: умные указатели и тд. Но когда...

boost::geometry::model::box и boost::geometry::area
Здравствуйте! Пытаюсь измерить площадь box'a :D, но не знаю как правильно это сделать. Вот этот код при компиляции выдает кучу ошибок: ...

Qt и boost
Как правильно прикрутить boost к Qt Creator? Можно ли использовать уже установленный boost для Visual Studio (через инсталятор)? Как...

Подключен ли boost?
Подскажите, как узнать, подключены ли библиотеки boost к Visual Studio? Пересел за чужую машину, и нужно узнать. Вариант скомпилировать...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru