singletone в пределах потока
От: ё-лка  
Дата: 19.11.07 16:24
Оценка:
Есть примерно такой код

SomeClass::Func()
{
   memder->SomeFunction();
}


member::SomeFunction()
{
 // SomeClass  - SingleTone
  SomeClassHolder()->Instance()->SomeOtherFunction();
}



Раньше был один поток и такая конструкция работала, теперь появилась необходимость распределить нагрузку на несколько потоков, следовательно конструкция типа SomeClassHolder()->Instance()->SomeOtherFunction() не подходит. пока вижу 2 варианта решения.

1)Написать Singletone — который в зависимости от того из какого потока его вызвали будет возвращать соответствующий указатель.
— количество потоков константно не изменяется во время работы программы.
2)Передавать нужный объект в качестве параметра SomeOtherFunction(SomeClass &someclass);

Интересно может есть какиенить подводные камни которых я не вижу или другие интересные решения ?
Re: singletone в пределах потока
От: leonidvp Россия  
Дата: 19.11.07 16:44
Оценка:
Здравствуйте, ё-лка, Вы писали:

ЁЛ> SomeClassHolder()->Instance()->SomeOtherFunction();

Еще можно сделать SomeClass потоко-безопасным, и пусть все потоки работают с одним экземпляром.
Если нельзя — то потоково-локальный синглтон самое лучшее ИМХО, потребуется минимум изменений в существующем коде
Re: singletone в пределах потока
От: AndrewJD США  
Дата: 19.11.07 16:44
Оценка:
Здравствуйте, ё-лка, Вы писали:

ЁЛ>1)Написать Singletone — который в зависимости от того из какого потока его вызвали будет возвращать соответствующий указатель.

ЁЛ>— количество потоков константно не изменяется во время работы программы.
Очень неудобно отлаживать.

ЁЛ>2)Передавать нужный объект в качестве параметра SomeOtherFunction(SomeClass &someclass);


ИМО, это вариант получше будет.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[2]: singletone в пределах потока
От: WolfHound  
Дата: 19.11.07 19:19
Оценка: 2 (1) -1
Здравствуйте, AndrewJD, Вы писали:

ЁЛ>>2)Передавать нужный объект в качестве параметра SomeOtherFunction(SomeClass &someclass);

AJD>ИМО, это вариант получше будет.
+1
С одной поправкой.
Передавать нужно не SomeClass &someclass, а Context* context.
Где Context примерно такого вида:
struct Context
{
    SomeClass* const someclass;
};

Тогда если понадобится протащить еще и SomeElseClass то просто добавляем его в контекст.
И вобще Re[3]: Singleton против static class c# 2
Автор: WolfHound
Дата: 16.05.06


А людей которые говорят что синглетоны рулят не слушай ибо синглетоны почти всегда создают проблемы (например в твоем случае) и никогда ничего не дают.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: singletone в пределах потока
От: qqqqq  
Дата: 19.11.07 19:57
Оценка: +1
Посмотри thread local storage: TlsAlloc , TlsSetValue, TlsGetValue
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: singletone в пределах потока
От: AndrewJD США  
Дата: 19.11.07 21:06
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>С одной поправкой.

WH>Передавать нужно не SomeClass &someclass, а Context* context.

WH>А людей которые говорят что синглетоны рулят не слушай ибо синглетоны почти всегда создают проблемы (например в твоем случае) и никогда ничего не дают.


Сейчас как раз занимаюсь тем что избавляюсь от синглетона который намертво связал несколько разных компонентов.
Так народ чтобы хоть как-то их по отдельности протестировать во всю использовал нездоровые хаки с дефайнами, неймспейсами и включением одного cpp файла в другой.

Сначала я хотел отрихтовать реализацию синглетона, чтобы можно было подпихнуть mock объект. Но теперь пришел к выводу что дешевле будет выкинуть его нах. и протянуть контест через пяток классов.
Так что, кто ищет изощренный трах — синглетоны ваш выбор!
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[3]: singletone в пределах потока
От: ё-лка  
Дата: 22.11.07 16:22
Оценка:
Здравствуйте, WolfHound, Вы писали:

Спасибо.
Re[3]: singletone в пределах потока
От: Пётр Седов Россия  
Дата: 23.11.07 14:58
Оценка: -1 :)
Здравствуйте, WolfHound, Вы писали:
WH>А людей которые говорят что синглетоны рулят не слушай ибо синглетоны почти всегда создают проблемы (например в твоем случае) и никогда ничего не дают.
В некоторых случаях singleton вполне уместен, была ветка
Автор: Graf Alex
Дата: 14.06.07
.

2 ё-лка:
Singleton в рамках потока реализуется с помощью thread local storage (TLS), qqqqq уже написал.
Пётр Седов (ушёл с RSDN)
Re[4]: singletone в пределах потока
От: WolfHound  
Дата: 23.11.07 15:15
Оценка:
Здравствуйте, Пётр Седов, Вы писали:

ПС>В некоторых случаях singleton вполне уместен, была ветка
Автор: Graf Alex
Дата: 14.06.07
.

Конкретнее.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.