De andere threads in het huidige proces worden niet door een vork gedood - ze zijn er nog steeds en lopen in de ouder. Het probleem dat u lijkt te hebben is dat fork
slechts één SINGLE thread in de huidige procces doorzoekt, waardoor een nieuw proces wordt gecreëerd met één thread met een kopie van alle niet-thread bronnen in de bovenliggende.
Wat je blijkbaar wilt, is een manier om een volledige multithreaded-taak te dupliceren, alle threads erin te schrijven en een nieuw proces/nieuwe taak met hetzelfde aantal threads te maken.
Om dat te doen, zou je alle andere threads in het proces moeten zoeken en pauzeren, hun huidige status (inclusief alle vergrendelingen die ze bevatten) dumpen, een nieuw proces vorkten en vervolgens elk van die andere threads in (opnieuw) maken het kind, waarbij de vergrendelingsmodus opnieuw wordt bedraad om waar nodig naar de nieuwe child-threads te verwijzen.
Helaas is de POSTX pthread-interface hopeloos ondergespecificeerd en biedt geen mogelijkheid om dat te doen. In het bijzonder mist het een soort reflectieve interface waarmee je kunt achterhalen welke threads daadwerkelijk worden uitgevoerd.
Als je dit toch wilt proberen, zie ik twee manieren om dit te benaderen:
-
snuffel rond in/proc/self/task om erachter te komen welke threads worden uitgevoerd in uw proces, waardoor die reflecterende interface op een zeer niet-draagbare manier wordt verkregen. Je zult waarschijnlijk uiteindelijk de andere threads moeten ptrace (2) om hun interne status te krijgen. Dit zal heel moeilijk zijn.
-
verpak de pthreads-bibliotheek - in plaats van rechtstreeks bibliotheek te gebruiken, onderschep elke oproep en houd alle threads/mutexes/locks bij die worden aangemaakt, zodat je die informatie beschikbaar hebt wanneer je wilt splitten. Dit werkt prima, zolang u geen bibliotheken van derden wilt gebruiken die pthreads gebruiken
De tweede optie is veel eenvoudiger (en enigszins draagbaar), maar werkt alleen goed als je toegang hebt tot alle broncode van je hele applicatie en deze kunt aanpassen om je wrappers juist te gebruiken.