Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Singleton и многопоточное программирование 
:(
    Опции темы
shtuceron
Дата 13.4.2012, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 17.2.2008

Репутация: нет
Всего: нет



Добрый день.

Скажите как ведет себя реализация паттерна одиночка в многопоточном программировании.

Я пишу многопоточное приложение, в котором используется один класс и мне очень не хотелось бы создавать экземпляры этого класса в каждом потоке, поэтому решил воспользоваться паттерном одиночка. Скажите могут ли возникнуть проблемы при использовании одного объекта в нескольких потоках (блокировку через lock я ставлю).

И еще вопрос, в классе (одиночка) у меня реализованы события, нужно ли для каждого потока создавать события, которые потоки будут обрабатывать? или достаточно в главном потоке определить события?

Спасибо.
PM MAIL WWW   Вверх
azesmcar
Дата 13.4.2012, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата(shtuceron @  13.4.2012,  09:18 Найти цитируемый пост)
Скажите как ведет себя реализация паттерна одиночка в многопоточном программировании.

Встречный вопрос. Какая реализация?
Ленивая инициализация НЕ потокобезопасна, но защищать инициализацию через lock идея не из лучших, лишний lock при каждом обращении. Лучше инициализировать в основном потоке, а потом спокойно использовать.

Цитата(shtuceron @  13.4.2012,  09:18 Найти цитируемый пост)
Скажите могут ли возникнуть проблемы при использовании одного объекта в нескольких потоках 

Смотря какое использование. Чтение потокобезопасно, запись из нескольких потоков необходимо защищать через lock.

Цитата(shtuceron @  13.4.2012,  09:18 Найти цитируемый пост)
блокировку через lock я ставлю

Нет, но не переусердствуй с lock-ами. Вообще старайся сводить их количество к необходимому минимуму.


Цитата(shtuceron @  13.4.2012,  09:18 Найти цитируемый пост)
И еще вопрос, в классе (одиночка) у меня реализованы события, нужно ли для каждого потока создавать события, которые потоки будут обрабатывать? или достаточно в главном потоке определить события?

Не понял вопроса.

Это сообщение отредактировал(а) azesmcar - 13.4.2012, 09:25
PM   Вверх
shtuceron
Дата 13.4.2012, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 17.2.2008

Репутация: нет
Всего: нет



Цитата

Встречный вопрос. Какая реализация?
Ленивая инициализация НЕ потокобезопасна, но защищать инициализацию через lock идея не из лучших, лишний lock при каждом обращении. Лучше инициализировать в основном потоке, а потом спокойно использовать.


Так я и делаю, инициализация проходит в основном потоке. Но если мы используем скажем TCP/IP соединение в разных потоках может возникнуть ситуация одновременной отправки сообщений - следовательно может возникнуть конфликт. Или я не прав?

Про события - самые обычные event-ты (например: пришел ответ от сервера - ошибка - я вызываю этот event и он обрабатывается в том потоке, который его реализует)... Если я в разных потоках попытаюсь реализовать события

Код

example.VSErrorEvent += new Singleton.VSErrorDelegate(OnVSError); (в двух потоках их объявил, ну функционал обработки ошибок разный)


Они и будут выполняться в разных потоках именно 2 события или только одно события в том потоке который сейчас активен?
PM MAIL WWW   Вверх
azesmcar
Дата 13.4.2012, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата(shtuceron @  13.4.2012,  11:28 Найти цитируемый пост)
Но если мы используем скажем TCP/IP соединение в разных потоках может возникнуть ситуация одновременной отправки сообщений - следовательно может возникнуть конфликт. Или я не прав?

Если сам класс соединения не обеспечивает безопасность - тогда может. smile 

Цитата(shtuceron @  13.4.2012,  11:28 Найти цитируемый пост)
я вызываю этот event

Обрабатывается он в том потоке, из которого вызываешь.
PM   Вверх
jonie
Дата 17.4.2012, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



вот тут неплохая дока по теме http://www.yoda.arachsys.com/csharp/singleton.html
я только замечу проблему, описанную там отдельно:
Код

!!!!! // Bad code! Do not use! !!!!!!
public sealed class Singleton
{
    static Singleton instance=null;
    static readonly object padlock = new object();

    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            if (instance==null)
            {
                lock (padlock)
                {
                    if (instance==null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
}

почитайте..


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
azesmcar
Дата 17.4.2012, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



jonie

Это же DCLP. Хотя я далеко не любитель этого патерна, тем не менее в .NET этот код рабочий. Модель памяти .NET гарантирует, что любая атомарная операция и любой lock - full memory fence. В данном случае lock (padlock) - это барьер и код вполне рабочий.
А почитать стоит smile 

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1161 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.