![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Loony |
|
|||
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 6.12.2007 Репутация: нет Всего: нет |
Добрый вечер, Уважаемые! Скажу сразу, с Delphi не очень дружу, могу сморозить чушь!
![]() ![]() Вопросы: 1. Правльным ли будет использовать в моем случае критические секции? 2. Если нет, то что надо использовать!? 3. Чем грозит длительная блокировка потока и грозит ли чем-то вообще? 4. Возможно при использовании Delphi с потоками есть еще какие-то ньюансы? P.S. Delphi 7, если это важно! |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Ни чем не грозит кроме ожидания. Блокировать доступ нужно ко всем функциям или только к той конкретной, которая используется в текущий момент? Если только текущую, то можно сделать несколько критических секций для каждой функции. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Loony |
|
|||
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 6.12.2007 Репутация: нет Всего: нет |
То есть, на первый вопрос ответ - да!?
![]() |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Я имел ввиду разместить критическую секцию внутри функции. Представь, что функцию вызываешь из разных модулей, тогда критическую секцию прийдеться объявлять в одном из общих модулей, да и забыть вставить ее можно случайно, а если критическую секцию вставить в функцию, то во первых понадобиться всего одна критическая секция во вторых, когда второй поток попытается вызвать функцию, то он зайдет и автоматом заблокируется. Есть еще вариант сделать мьютекс с таймаутом. Т.е. второй поток зайдет в функцию подождет 100мс, увидит что ждать нужно долго и выйдет досрочно с специальным кодом ошибки, после чего сможет делать что-то другое и повторить попытку через некоторое время. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Loony |
|
|||
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 6.12.2007 Репутация: нет Всего: нет |
Alexeis, если имеется ввиду внутри функции длл, то сделать этого не получится, исходников длл нет.
|
|||
|
||||
Felan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Неважно. Можно сделать модуль-обертку, где будут просто вызываться нужные функции из длл + синхронизация.
От себя добавлю, что синхронизировать нужно только доступ к данным, причем, когда существует доступ на изменения. Синхронизировать доступ на чтение к данным которые не изменяются не имеет смысла. Синхронизировать функции генерации чего-либо, если при генерации не используются глобальные данных, которые существуют И изменяются между вызовами таких функций, тоже синхронизировать смысла нет. -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
|||
|
||||
Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
эт ты зря... -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Это еще почему? По моему синхронизация не нужна даже при условии что открывается только доступ для чтения. Важно чтобы не было даже косвенного влияния того что читается на то что пишется. Гарантия неизменности это дополнительное необязательное условие. Представим себе ситуацию. На сервер непрерывно поступают данные о прогнозе погоды по разным регионам. Существует много служб, которые достают эти данные и публикуют у себя. Ситуация что в прогноз на хабаровск будет текущий, а на Москву будет за прошлый час устраивает всех. Тем не менее, общий прогноз находиться на стадии записи, тогда как доступ к отдельным записям доступен всегда. Если есть гарантия неизменности то вообще идеально... -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Loony |
|
|||
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 6.12.2007 Репутация: нет Всего: нет |
Felan, обертки уже сделал!
![]() |
|||
|
||||
Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
Alexeis, а что получится если два потока будут одновременно читать из одного места?
* ушел читать rtfm... но мне всегда казалось что... -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Такое происходит и постоянно. Например флаги мьютекса или семафора. К ним же происходит обращение из нескольких потоков, тот же счетчик семафора. Физически память не позволит одновременно обратиться даже при двух процах, потому это в любом случае будет последовательно. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Felan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Ниче не будет. Оба прочитают и все. Если используются примитивные типы, то скорее всего ничего не будет даже если третий будет одновременно писать, а вот если классы, стринги, записи и т.п., то может получится так, что один поток начал писать, а второй начал читать, первый притормозил, а второй прочитал мусор... Ты не путай, это специальные объекты, доступ к которым контролирует система. А к память как раз даже очень позволяет обращаться одновременно из разных потоков. Для этого и существует синхронизация. -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
И чем же системам ограничивает? Там просто атомарные типы отвечают за состояние, потому если один записал true, то другой не сможет прочитать что-то на середине записи состояния true.
Ну тут все зависит организации самого доступа и что считать противоречивым состоянием. Это определяется в каждом конкретном случае отдельно. Излишняя синхронизация тоже вредна, более того она может приводить самоблокировке системы там где можно было без этого обойтись. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Felan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Внутренними правилами ограничивает. Не путай системные спец. объекты и доступ к памяти. Тут все зависит от везения. Т.к. resume останавливает поток в произвольном месте между процессорными инструкциями, и если запись данных занимает болше одной инструкции, то вероятна ситуация, когда записано только половина данных. И вероятность пропорциональна количеству потоков и частоте обращений. Поэтому и рекомендуется явно выделять точки ожидания для потока. Что такое самоблокировка? Если криво сделана синхронизация, так, что она приводит к дедлоку, то это именно криво сделанная синхронизация. Само обычно ничего не бывает ![]() -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Например потоки работают с 2мя записями. Для этого она захватывает одну и ждет вторую, в это время второй поток захватил вторую и ждет первую, которую занял первый. Таким образом 2 потока ждут друг друга. Возможны и другие более сложные ситуации с косвенной связью, потому избыточная синхронизация также вредна как и недостаточная. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |