![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| DEER |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 749 Регистрация: 12.4.2005 Где: г. Рязань Репутация: 1 Всего: 13 |
господа. возникла пара вопросов, касающихся синхронизации методов в C#.
точнее мне надо синхронизировать свойство (get и set как я понимаю) некоего объекта. поиском пользовался кое что нашел полезное. (вот сообщение Domestic Cat'а) Осталось упочнить детали. итак. суть моёй задачки такова
я пишу класс, у которого будет поле empl, например. Создаю для него свойство
вроде всё ясно, кроме правила № 4. Далее приступаем к реализации. Domestic Cat использовал в примере поле private bool isBeerReady;. Если такой подход корректный, то добавлю в мой класс поля
и теперь можно реализовать само свойство.
скажите, правильно ли я понял использование lock, что надо указывать какой объект захватываем. что такое Monitor и правильно ли я его использую. как можно реализовать 4-е правило из задания. Я просто не до конца его понял. заранее сенкс Это сообщение отредактировал(а) DEER - 20.6.2006, 10:35 -------------------- |
||||||||
|
|||||||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Пройдусь по коду
Не должно быть у тебя задержки. Доместикс делал ее для емуляции процесса выпивания пива Пока все. В остальном я пас |
|||
|
||||
| DEER |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 749 Регистрация: 12.4.2005 Где: г. Рязань Репутация: 1 Всего: 13 |
ivashkanet, спасиба, но она должна быть по заданию, я просто не всё задание написал
-------------------- |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
DEER, насчёт того, почему внутри блока lock используется Monitor - тут непонятка: если доступ к empl заблокирован для доступа из более чем одного потока (пресловутый lock), то зачем когда уже вошли внутрь lock - ещё и ждать монитором ? Всё равно при использовании lock более чем один reader или writer не сможет в одно и то же время работать с empl.
З.Ы. описываемая задача уже реализована средствами Framework - это класс ReaderWriterLock. -------------------- ![]() |
|||
|
||||
| DEER |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 749 Регистрация: 12.4.2005 Где: г. Рязань Репутация: 1 Всего: 13 |
mr.DUDA,
вот так получается? на счет того что она решена... я это предполагал, но решить надо самому.это типа тестовое задание -------------------- |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
А какой глубокий смысл делать ожидание, если вход в lock и так ожидает выхода из lock другого потока ?
З.Ы. оператор lock сам по себе реализован на основе Monitor-ов, между прочим -------------------- ![]() |
|||
|
||||
| DEER |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 749 Регистрация: 12.4.2005 Где: г. Рязань Репутация: 1 Всего: 13 |
ну вот я и спрашиваю. правильно я их использую или нет?
Добавлено @ 16:53 тут посоветовали вообще без локов делать... -------------------- |
|||
|
||||
| Аленка |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 16.6.2006 Репутация: нет Всего: нет |
А как без локов получилось? Если получилось?
так не получится, lock()-это тоже самое что Monitor.Enter() +Monitor.Exit(). Т.е. надо сначала сделать enter, затем wait, exit. 4 пункт- это классическая проблема writers-readers. Может решиться введением дополнительных переменных, считающих количество ожидающих writerов и readerов. Проверка такая: если readerов больше нет, и есть writer, то запускаем его. Пока не закончатся |
|||
|
||||
| DEER |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 749 Регистрация: 12.4.2005 Где: г. Рязань Репутация: 1 Всего: 13 |
Совсем без локов не получилось... кое что похожее на правду получилось как раз с Enter и Exit... так и не понял почему правда.... при исп Локов вылетали екзепшены разнообразные, а сейчас по крайней мере что то делает.... Добавлено @ 11:12 выгладит вот так
-------------------- |
||||
|
|||||
| Аленка |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 16.6.2006 Репутация: нет Всего: нет |
А как тестируешь?
что передаешь вместо DoSomeWork? Это сообщение отредактировал(а) Аленка - 21.6.2006, 11:31 |
|||
|
||||
| DEER |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 749 Регистрация: 12.4.2005 Где: г. Рязань Репутация: 1 Всего: 13 |
тест не очень получился...
-------------------- |
|||
|
||||
| YoungMan |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 13.7.2006 Репутация: нет Всего: нет |
Если использовать код, приведенный DEER-ом, то получим, что "читатели" будут выводить "скомканные" данные о сотруднике:
Один1-Одинович1-1 Один2-Одинович1-1 Один2-Одинович2-1 Один2-Одинович2-1 Один2-Одинович2-2 Один3-Одинович2-2 Один3-Одинович3-2 Один3-Одинович3-3 ... (текст функции writer опущен) Вопрос: как от этого избавиться? |
|||
|
||||
| YoungMan |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 13.7.2006 Репутация: нет Всего: нет |
и еще вопрос, почему если убрать конструкцию try-catch появляются ошибки типа:
в месте проверки условия циклов:
|
||||||
|
|||||||
| YoungMan |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 13.7.2006 Репутация: нет Всего: нет |
На мой взгляд класс MyClass должен выглядеть вот так:
|
|||
|
||||
| Аленка |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 16.6.2006 Репутация: нет Всего: нет |
Потому и появляются, что Object synchronization method was called from an unsynchronized block of code. try catch похоже просто позволяет избежать потенциальных ошибок при обращении к уже используемому монитору. Синхронизировать надо использование монитора. И скомканные данные получаются, потому что нет синхронизации. Это сообщение отредактировал(а) Аленка - 14.7.2006, 20:04 |
||||
|
|||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |