2 / 2 / 0
Регистрация: 03.06.2009
Сообщений: 102
|
||||||
1 | ||||||
реализация ThreadSafe функции24.07.2013, 14:23. Показов 2082. Ответов 37
Метки нет (Все метки)
Пишу статическую библиотеку функций, на основе которой разрабатывают приложения.
При создании многопоточных приложений на её основе начались проблемы. Думаю, что это связано с тем, что разные потоки мешаются друг другу, заходя в одну и туже функцию библиотеки. На первое время решил добавить в функции вот такую конструкцию:
Спасибо.
0
|
24.07.2013, 14:23 | |
Ответы с готовыми решениями:
37
Являются ли new / malloc threadsafe? Реализация функции печати результатов предыдущей функции Реализация функции c++ Реализация функции принтф |
2 / 2 / 0
Регистрация: 03.06.2009
Сообщений: 102
|
||||||
25.07.2013, 13:52 [ТС] | 21 | |||||
Вроде бы понял.
Спасибо большое за книжку, почитаю. Добавлено через 20 часов 34 минуты подумав, понял что инициализацию и удаление надо из функций выносить и решил сделать так: 1. Переменные критических секций поля класса. 2. Инициализация при открытии устройства. 3. Использование в функциях. 4. удаление в функции закрытии устройства. В коде получается так:
Спасибо.
0
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
|
25.07.2013, 13:54 | 22 |
Я всегда так делаю
0
|
Ушел с форума
|
|
25.07.2013, 14:02 | 23 |
0
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
|
25.07.2013, 14:21 | 24 |
Чота я невнимателен был, я не так делаю. Уменя обычно в конструкторах EnterCriticalSection(...), а в деструкторах DeleteCriticalSection(...).
Добавлено через 15 минут Не аргумент - забыть можно всё что угодно, и даже если не повиснет, это будет баг, который надо будет искать в любом случае. Тем более что баг, который приводит к зависанию проще отловить.
0
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
25.07.2013, 14:25 | 25 |
Ооо! А если оно "зависает" раз в месяц, только на оборудовании Заказчика, и еще нерегулярно - в зависимости от положения звезд?
Собссна, я уверен, что пару раз поискав такие трудноуловимые баги в ночь перед релизом, ТС быстро придет к мысли об использовании RAII.....
0
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
|
25.07.2013, 14:35 | 26 |
Ок, тогда будет найти сложнее)
Всё-таки я считаю, что просто нужно взять привычку - не забывать. А то можно подумать, что забыть что-нибудь другое вполне приемлемо. Добавлено через 4 минуты Кстати, приведи пример, как бы ты в данном случае использовал бы RAII? Не пытаюсь мериться, действительно интересно.
0
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
||||||
25.07.2013, 15:01 | 27 | |||||
Ну в данном то случае оно тривиально:
1
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
|
25.07.2013, 15:16 | 28 |
У тебя после конструктора сразу деструктор вызовется. МБ нужно всё таки экземпляр где-то сохранить?
А за идею спасибо
0
|
2 / 2 / 0
Регистрация: 03.06.2009
Сообщений: 102
|
|
25.07.2013, 15:17 [ТС] | 29 |
ну это будет проблема разработчика приложения. Я думаю ему всё-таки будет легче не забывать close вызывать, чем самому с threadSafe разбираться.
а где же InitializeCriticalSection?
0
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
|
25.07.2013, 15:20 | 30 |
0
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
||||||
25.07.2013, 15:24 | 32 | |||||
A::A() A::~A() s tvoih slov destructor doljen bit vizvan posle etoy stroki
0
|
2 / 2 / 0
Регистрация: 03.06.2009
Сообщений: 102
|
|
25.07.2013, 15:26 [ТС] | 33 |
на первое время так и сделаю.
в RAII чуть позже постараюсь вникнуть. По первым впечатлениям вещь очень нужная. Спасибо!
0
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
|
25.07.2013, 15:29 | 34 |
Забыли один раз экземпляру имя дать и получился баг
Добавлено через 1 минуту который Добавлено через 35 секунд Так может быть, всё таки не в идеологии дело, а втом что нужно учиться не забывать?
0
|
25.07.2013, 15:33 | 35 | |||||
Praktolock,
0
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
25.07.2013, 15:33 | 36 |
Верно, забыл. Писал код прямо в редакторе форума. Виноват-с... :-(
0
|
Ушел с форума
|
|
25.07.2013, 15:33 | 37 |
Ошибаетесь, господа.
Как только в коде появляются ветвления, такие ошибки начинают возникать на пустом месте. И во время внесения изменений (рефакторинг) с таким подходом будет очень легко напортачить, если использовать "голые" программные интерфейсы, не прикрытые RAII. Интерфейсы open-do-close хороши только в вырожденных случаях, сведенных к функциям в двадцать строк, где все на ладони и нет инвариантов. Кроме того, если во время использования "голого" интерфейса кто-нибудь кинет исключение, очистка ресурсов не будет выполнена и произойдет утечка. Так что без RAII никуда. Можно держать в уме все нужные контакты и планы встреч. А можно пользоваться ежедневником и напоминалками, освобождая мозг для других задач. Я предпочитаю второе.
0
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
|
25.07.2013, 15:41 | 38 |
Если "кто-то" кинет исключение не предусмотренное мной, это краш программы, и ресурсы ей больше не понадобятся.
Впрочем я не пытаюсь сказать, что RAII это плохо. И в принципе на 95% согласен.
0
|
25.07.2013, 15:41 | |
25.07.2013, 15:41 | |
Помогаю со студенческими работами здесь
38
Реализация функции srcat. Реализация функции erase() Реализация функции strtok Реализация friend функции Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |