Mam do napisania pewien program oparty na wątkach, opiszę go w skrócie. Chodzi o filtrowanie wczytanego przez użytkownika obrazu, mam do zrobienia kilka filtrów, każdy w osobnym wątku i każdy ma działać na własnej kopii obrazka a potem wczytywać (po kolei) do wątku głównego i wyświetlać poszczególne filtry. Powiedzmy, że mam na to pomysł, problem jest w tym, że program ma również reagować na to co robi użytkownik, tzn. jeśli jest w trakcie filtrowania jakiegoś obrazka, a użytkownik wpisze już nową nazwę, to program ma przerwać filtrowanie i zacząć filtrować nowy obrazek. jeśli obraz zdąży się przefiltrować to czeka aż użytkownik poda nową nazwę. Potrzeby jest do tego jakiś wątek nadzorujący. W związku z tym moje pytanie brzmi, w jaki sposób (nie znalazłem żadnej funkcji) zrobić aby można było wątek uruchomić od nowa (bez zabijania go i tworzenia od nowa). Wymyąliłem, że wątek nadzorujący wyglądałby mniej więcej tak:
Kod: Zaznacz cały
void nadzor(char nazw[100])
{
char tmp[100] = nazw;
while(1)
{
if(strcmp(tmp,nazw) != 0)
{
//tu wlasnie musze zrobic cos aby watki startowaly od nowa//
tmp = nazw;
}
}
}
Ma to działać tak, że wątek cały czas będzie sprawdzał zmienną nazwę (zmienna globalna, wprowadzona przez użytkownika) i jeśli ulegnie zmianie to uruchomi ponownie wątki, do tmp przypisze nową nazwę i znów to samo.
Wątki z filtrami napisałem w ten sposób:
Kod: Zaznacz cały
void *filtr1(void *mem)
{
while(1)
{
//tworzy wlasna kopie obrazka
char *tab;
tab = (char *)malloc(filesize*sizeof(char));
memcpy(tab,p,filesize);
//tu bedzie jakis filtr
//////////////////////
//filtr1
//////////////////////
//zapisuje przefiltorwany obraz do pamieci
//zastosuje mutexy aby watki nie zapisywaly do wspolnej pamieci jednoczesnie
pthread_mutex_lock(&mut1);
memcpy(p,tab,filesize);
pthread_mutex_unlock(&mut1);
//zwalnia pamiec usuwajac swoja kopie obrazka
free(tab);
//oczekiwanie watku
sem_init(&s1,0,0);
sem_wait(&s1);
}
}
Mam nadzieję, że wszystko jasno opisałem.