Komunikacja ogromnej ilości wątków z wątkiem głównym

0

Mam aplikację serwera (TCP) wielowątkowego. Wątek główny programu odpowiada za obsługę obiektu serwera TCP oraz za trzymanie danych aplikacji. Wątki klientów - jak łatwo domyślić się - obsługują klientów TCP i ewentualnie modyfikują stan danych w wątku głównym.

Problem zaczyna się tutaj. Połączonych klientów może być powiedzmy 10 000 (hipotetycznie, ale zastanówmy się nad wartością ekstremalną). Oznacza to 10 000 wątków (!) klientów, a przy takiej liczbie ich synchronizowanie (w celu modyfikowania danych albo w celu sprawdzenia czy ktoś inny zmodyfikował) chyba mija się z celem. W jaki sposób efektywnie (!) przekazywać dane między wątkami klientów a wątkiem głównym? Samo przekazanie nie jest trudne w jakikolwiek sposób, ale jaki, waszym zdaniem, będzie w takich warunkach najszybszy - jest to tu sprawa priorytetowa.

Myślałem nad potokami nienazwanymi, ale czy ilość 10 000 nie będzie w jakikolwiek sposób problemem - również ze względu na ograniczenia otwartych uchwytów? Synchronizowanie - czyli tak, jak to działa obecnie - nie wydaje mi się sensownym wyjściem.

0

po prostu nie twórz tylu wątków. po pierwsze windows nt ma coś takiego, jak pula wątków, co w tym wypadku wydaje mi się najbardziej sensownym rowziązaniem (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/using_the_thread_pool_functions.asp), po drugie 10 000 klientów naraz podłączonych? sytuacja cokolwiek abstrakcyjna, poza tym przełączanie kontekstu pomiędzy tak kosmiczną ilością wątków zabrało by baaardzo dużo czasu.

0

Wiem, że to przypadek abstrakcyjny. Analizuję go sobie teoretycznie - po prostu zastanawiam się nad zagadnieniem. Też myślałem o zrezygnowaniu z wątków, ale pisanie aplikacji w ten sposób bardzo ułatwia życie. Każdy wątek (pomijając ich ilość) może sobie weryfikować lub odbierać/wysyłać dane, a jak przychodzi do obróbki wspólnych danych, dopiero angażuje wątek główny.

Ogólnym problemem jest obsługa dużej ilości połączeń (nie koniecznie dużej ilości wątków - te można przy ogólnej analizie problemu wyeliminować z zagadnienia całkowicie).

Jak sensownie szybko obsłużyć 10 000 połączeń klienckich?

0

A może by tak zrobić coś na wzór windows messages. Zrobić listę FIFO, na którą wrzucasz informację wraz z id wątku docelowego i źródłowego. Adresat wiadomości pobiera wiadomość z listy i kasuje ją przesuwając wskaźnik na następny element.

0

Wątki klienckie między sobą nie muszą się wcale komunikować. Ta metoda może się przydać do przekazywania danych przez klientów wątkowi głównemu.

Natomiast, jeśli chodzi o przekazywanie danych klientom, w takim przypadku problemem wąskiego gardła byłby dostęp do naszej listy. Wszystkie wątki musiałby czekać, aż kolejne sprawdzą, czy na liście nie ma danych dla nich.

0

To może w takim razie rozwiązaniem była by lista dla każdego wątku ;)

0

No to może zamiast listy, potok nienazwany.. dochodzimy tak do treści pierwszego posta.

0

moze zamiast tylu watkow robisz po watku przypadajacym na n klientow, a w samym watku obslugujesz jednoczescie kilkanascie polaczen,

0

To takie pośrednie rozwiązanie - nie ułatwi programowania, ale ograniczy ilość chcących się synchronizować/komunikować wątków. Zawsze to jakiś pomysł, choć nie powiem, by mnie satysfakcjonował, bo, patrząc w ten sposób, można wszystkich klientów obsłużyć w wątku głównym.

0

Szczawik, przeczytałeś w ogóle co to jest pula wątków? przecież to jest dokładnie to co opisujecie, i to już zaimplementowane w api windowsa!

0

Jasne, że przeczytałem i cały wieczór spędziłem nad jej wdrożeniem. Tak swoją drogą, dzięki za linka, bo jest bardzo przydatny.

Tylko teraz staram się omijać rozmaite systemowe ograniczenia ilości podłączonych do mojego programu klientów TCP. Oj dużo z tym zabawy..

//Dopisane: zajmuje mi to sporo czasu, bo mogę używać tylko Original ThreadPool API, bo to "łatwiejsze" działa dopiero od Windows Vista, a tym nie dysponuję - tylko XP.

Dopiszę tylko, że nie doszedłem jeszcze do działających rezultatów. Ale może dlatego, że m.in. w bibliotekach nie mam nagłówków wymaganych funkcji systemowych i ręcznie muszę je wklepywać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1