wielowątkowość w wykonaniu mike ;-)
Witam serdecznie po długim czasie. Hmm co do tego czasu, to raczej nic ciekawego się nie wydarzyło. Dziennie się uczę i pracuje. Do tego jakże by bujne życie towarzyskie (a raczej jego niedobory ;-P). No ale, taka już dola informatyka, który raczej się trzyma z dala od społeczeństwa :-D
No ale nie o tym traktuje ten wpis.
Dzisiaj przedstawię moją koncepcje wielowątkowości w systemach Unix/BSD/Linux w języku C/C++ - opartego na znanej i lubianej ;-) bibliotece pthread. Hmm, dlaczego właściwie się zająłem tą tematyką? Potrzeba matką wynalazku. Podczas pisania mojej aplikacji (dość rozległej - dodam), potrzebuję szybkie, bezproblemowej pracy wątków w tej aplikacji.
Pthread oczywiście spełnia moje wymagania, ale są pewne *ale*. Czym są te ale? No więc: przekazywanie sygnałów, argumentów między wątkami. Rzecz jasna, takie coś można wykonywać między zmiennymi lokalnymi (lub pthread_join() tak?). Ale ja ten "problem" (nie mogę tego nazwać problemem, ale spokojnie mogę to nazwać moim małym zapotrzebowaniem ;-)). No więc, zacznę tak:
/* Kod oczywiscie C/C++ */
struct thread_t{
void *(*proc) (void *); /* Thread function */
int tid; /* Thread ID */
char *agrv; /* Argumends, commands... */
int arg; /* If is new argv set 1, if no 0/null */
int sig; /* Thread signal */
};
static int thread_init(*(*proc) (void *));
static int thread_stop(int thread);
static int thread_sig(int thread, int sig);
static int thread_wait(int thread);
static int thread_send_argv(int thread, char *argv);
static char *thread_recv_argv(int thread);
* No więc, funkcja thread_init(*(*proc) (void *)) tworzy nowy wątek (tak samo jak pthread_create) ALE: funkcja wymaga mniej parametrów, zamiast podawania uchwytu do struktury pthread_t, podajemy samą nazwe wątku, a w rezultacie otrzymujemy handler [uchwyt] do naszego nowo utworzonego wątku).
* Funkcja thread_stop(int hthread) kończy nasz wątek (plusy: chyba żadne... minusy: [do dopracowania] jeśli zamiast int hthread podamy inny numer wątku, niż "nasz", to go zabijemy :-D). Funkcja może być wywoływana wewnętrznie przez wątek (tak samo jak się używa pthread_exit()) lub zewnętrznie, przez "rodzica".
* Funkcja thread_sig(int hthread, int signal) wysyła to wątku i uchywcie hthread sygnał int signal (plusy: wogóle możliwość wysyłania spersonalizowanych [czyli dla konkretnego wątku] konkretnie sygnałów w postaci liczby).
* Funkcja thread_wait(int hthread) wysyła do wątku informacja, iż ma czekać (funkcja w trakcie dopracowywania ;-)).
* Funkcja thread_send_argv(int hthread, char *argv) wysyła wiadomość/komendę do wątku hthread i ustawia flage w strukturze int arg; na 1.
* Funkcja char *thread_recv_argv(int hthread) odbiera zmienną char *argv ze struktury thread_t danego wątku.
Szczerze, to długo nad tą biblioteką nie siedziałem. Ale teraz ją udoskonalam ;-). Mam nadzieję, iż libethread0 (ethread - bo tak nazwałem wątki, nazwa jeszcze nie jest oficjalna), będzie nie długo do pobrania. Umieszczę stosowną notke na blogu i oczywiście, dorobię z boku malutkie submenu z działem Pobierz :-)
Pozdrawiam serdecznie, mike.





