2011-11-17 11 views
7

Od makecontext instrukcji ...Dlaczego makecontext nie działa z pthreads

Ze względu na ograniczenia w obecnej implementacji pthread, makecontext nie powinny być wykorzystywane w programach łączących przeciwko (3) biblioteki pthread (czy gwinty są używany lub nie).

Teraz moje pytanie brzmi, dlaczego to nie działa i jakie są alternatywne metody. Właściwie jestem zainteresowany przełączaniem stosów w wątku na poziomie użytkownika w niektórych punktach, ale widzę, że kiedy robię swapcontext, od czasu do czasu dostaję błędy segmentacji. Co powinienem zrobić?

chcę osiągnąć coś takiego ...

void thread_func(void * thread_args) 
{ 
a(); 
b(); 
getcontext/makecontext/swapcontext to call c(); 
d(); 
.... 
} 

Więc w tym przypadku, chcę użyć osobnego stosu podczas wykonywania funkcja c.

+0

Bardzo trudne pytanie ;-p! Brak jeszcze odpowiedzi! – MetallicPriest

+0

Co próbujesz użyć 'makecontext'/etc? Ich głównym celem jest implementacja bibliotek wątków, co jest trochę głupie, gdy już istnieją. – duskwuff

+0

@duskwuff, nie używam go do celów gwintowania. – MetallicPriest

Odpowiedz

9

Ze względu na ograniczenia w obecnej implementacji pthread, makecontext nie powinny być wykorzystywane w programach łączących przeciwko Pthread (3) Biblioteka

Ten rozdział podręcznika dotyczy LinuxThreads, który umożliwia zaokrąglenie %esp wartość do znalezienia bieżącego deskryptora wątku. To (oczywiście) nie wygenerowałoby poprawnego deskryptora dla wątków, gdybyś był wykonywany na alternatywnym stosie.

LinuxThreads nie są już używane przez żaden Linux dystrybuowany w ciągu ostatnich 5 lat, a {get,make,swap}context działa dobrze z wątkami NPTL.

EDYCJA: W rzeczywistości widzę tylko "z powodu ograniczeń" w NetBSD docs, a nie w Linux docs.

kiedy robię swapcontext, otrzymuję naruszenie ochrony pamięci co jakiś

Masz problem, który pojawia się jako błąd segmentacji teraz i potem. Nie dostarczyłeś wystarczających informacji, aby odgadnąć, gdzie może być ten błąd.

+1

Miło wiedzieć, że teraz działa. Dzięki za odpowiedź EmployedRussian :-p! I tak, to był rzeczywiście błąd, który naprawiłem teraz. – MetallicPriest