Czy konteksty (obiekty manipulowane przez funkcje w ucontext.h
) mogą być współużytkowane przez wątki? To znaczy, czy mogę swapcontext
z drugim argumentem będącym kontekstem utworzonym w makecontext
na innym wątku? Wygląda na to, że program testowy działa na systemie Linux. Nie mogę znaleźć dokumentacji w ten czy inny sposób, podczas gdy włókna Windows wydają się wyraźnie wspierać taki przypadek użycia. Czy to jest ogólnie bezpieczne i OK? Czy to standardowe zachowanie POSIX, że to powinno działać?ucontext w wątkach
Odpowiedz
Z man page
W V jak środowisko, po jednym ma ucontext_t typu określonego w i cztery funkcje getContext (2), setcontext (2) makecontext() i swapcontext(), że umożliwia przełączanie kontekstu na poziomie użytkownika pomiędzy wieloma wątkami kontrolki w ramach procesu.
Wygląda na to, do czego służy.
EDYCJA: chociaż this discussion wydaje się wskazywać, że nie powinieneś ich mieszać.
Nie. To mówi o "wątkach kontroli", wątkach, które są zapisywane i przywracane przez * context(). Nie mówi nic o mieszaniu * funkcji context() i pthreadów. – osgx
Czy dyskusja [Solaris] (http://groups.google.com/group/comp.programming.threads/browse_thread/thread/c29c8a84e16fdba9) jest przydatna? Dlaczego, na Boga, chcesz to zrobić? Gwintowanie jest wystarczająco śliskie, bez mieszania definicji nici. – spraff
To nie dla mnie. Rodzime wątki mogą być wystarczające dla zwykłego C, ale niewystarczające dla 1) coroutines, np. in Go, itp. 2) języki z zielonymi wątkami, np. Ruby/Python – osgx
W rzeczywistości istniała biblioteka wątków NGPT dla linuxa, która używa nie bieżącego modelu gwintowania 1: 1 (każdy wątek użytkownika jest wątkiem jądra lub LWP), ale model wątkowania M: N (kilka wątków użytkownika odpowiada do innej, mniejszej liczby wątków jądra).
Według ftp://ftp.uni-duisburg.de/Linux/NGPT/ngpt-0.9.4.tar.gz/ngpt-0.9.4/pth_sched.c:170 pth_scheduler można było poruszać konteksty wątku użytkownik między rodzimymi (jądro) wątków:
/*
* See if the thread is unbound...
* Break out and schedule if so...
*/
if (current->boundnative == 0)
break;
/*
* See if the thread is bound to a different native thread...
* Break out and schedule if not...
*/
if (current->boundnative == this_sched->lastrannative)
break;
Aby zapisać i przywrócić wątki użytkownika, który to ucontext można stosować ftp://ftp.uni-duisburg.de/Linux/NGPT/ngpt-0.9.4.tar.gz/ngpt-0.9.4/pth_mctx.c:64 i wydaje się, że był to korzystny sposób (mcsc
):
/*
* save the current machine context
*/
#if PTH_MCTX_MTH(mcsc)
#define pth_mctx_save(mctx) \
((mctx)->error = errno, \
getcontext(&(mctx)->uc))
#elif
....
/*
* restore the current machine context
* (at the location of the old context)
*/
#if PTH_MCTX_MTH(mcsc)
#define pth_mctx_restore(mctx) \
(errno = (mctx)->error, \
(void)setcontext(&(mctx)->uc))
#elif PTH_MCTX_MTH(sjlj)
...
#if PTH_MCTX_MTH(mcsc)
/*
* VARIANT 1: THE STANDARDIZED SVR4/SUSv2 APPROACH
*
* This is the preferred variant, because it uses the standardized
* SVR4/SUSv2 makecontext(2) and friends which is a facility intended
* for user-space context switching. The thread creation therefore is
* straight-foreward.
*/
Tak więc, nawet jeśli NGPT jest martwy i nieużywane, to wybrany kontekst *() do przełączania wątków użytkownika nawet pomiędzy wątkami jądra. Zakładam, że używanie rodziny * context() jest wystarczająco bezpieczne w Linuksie.
Podczas mieszania tekstu ucontexts i innych rodzimych wątków mogą wystąpić pewne problemy. Rozważę NPTL, który jest standardową linuxową biblioteką wątków od glibc 2.4. Głównym problemem jest THREAD_SELF - wskaźnik do struct pthread
bieżącego wątku. TLS (Thread-local storage) działa również przez THREAD_SELF. THREAD_SELF jest zwykle przechowywany w rejestrze (r2 on powerpc, %gs
na x86 itd.). get/setcontext może zapisywać i przywracać ten rejestr łamiąc wewnętrzne elementy natywnej biblioteki pthread (np. pamięć lokalną wątku, identyfikację wątków itp.).
Glibc setcontext will not save/restore %gs
register być zgodne z pthreads:
/* Restore the FS segment register. We don't touch the GS register
since it is used for threads. */
movl oFS(%eax), %ecx
movw %cx, %fs
Należy sprawdzić, czy setcontext oszczędza THREAD_SELF zarejestrować na architekturze jesteś zainteresowany Ponadto, kod może nie być przenośny między systemami operacyjnymi i libc
. s.
Nie do końca satysfakcjonujący, ale myślę, że to najlepsze informacje, jakie możesz mieć. Dzięki. – Flavio
- 1. Propagowanie wyjątków w wątkach?
- 2. Obsługa wyjątków w wątkach
- 3. Usuwanie śmieci w wątkach Perla
- 4. Podstawowe blokady danych w wątkach w tle
- 5. Odrzucony wyjątek wyjątku w wątkach Java
- 6. Co to są sekcje krytyczne w wątkach
- 7. Matplotlib: równoczesne kreślenie w wielu wątkach
- 8. przy użyciu std :: cout w wielu wątkach
- 9. Ustawianie pozycji tabeli w wielu wątkach
- 10. Wątki Java lub C# są oparte na wątkach przestrzeni użytkownika lub wątkach jądra-przestrzeni?
- 11. Różnica między przerwaniem i przerwaniem w wątkach w .NET
- 12. . Żądania https https w różnych protokołach bezpieczeństwa w wątkach
- 13. Czy Java niejawnie powiadamia o oczekujących wątkach?
- 14. Bezpieczne, aby zaktualizować oddzielne regiony BufferedImage w osobnych wątkach?
- 15. Co mogę zrobić z nakładającymi się etykietami w tych wątkach?
- 16. Najlepszy sposób przekazywania obiektów między klasami w różnych wątkach?
- 17. Jak się uczyć o wątkach, szczególnie w Javie
- 18. Korzystanie z zależności na wielu wątkach z Parallel.ForEach
- 19. Jaka jest różnica między wykonywaniem ExecutorService i thread.run w uruchomionych wątkach jednocześnie w Javie?
- 20. Naruszenie dostępu z TIdHttp działa na wielu wątkach w tym samym czasie
- 21. Jak używać typów szablonów jako parametrów szczeliny i sygnału w wielu wątkach?
- 22. Co mogę użyć w wątkach Ruby, jeśli nie są one naprawdę równoległe?
- 23. Uzyskiwanie dostępu do ziaren proxy o określonym zasięgu w wątkach z
- 24. Czy mogę bezpiecznie polegać na IsBackground w wątkach, gdy aplikacja się zakończy?
- 25. Błąd "Nazwa lub usługa nieznana (SocketError)", gdy działa w wielu wątkach
- 26. Jak przeprowadzić ocenę zwarcia w Javie na dwóch równoległych wątkach zwracających wartości logiczne?
- 27. python: jak wysłać pakiety w wielu wątkach, a następnie sam zabić wątek
- 28. „Animatorzy mogą być prowadzone jedynie na wątkach Looper” podczas intrumentation testowania na urządzeniach
- 29. Ruby - jak uruchomić metodę dla każdego elementu tablicy na różnych wątkach?
- 30. Czy dwa luźne zapisy do tej samej lokalizacji w różnych wątkach będą zawsze widoczne w tej samej kolejności przez inne wątki?
Czy możesz umieścić swój program testowy, tutaj? – vpit3833