2011-11-17 14 views
7

da manuale makecontext ...Perché makecontext non funziona con pthreads

A causa di limitazioni nella realizzazione pthread corrente, makecontext non deve essere utilizzato in programmi che puntano contro il pthread (3) libreria (se le discussioni sono usato o meno).

Ora la mia domanda è: perché non funziona e quali sono i metodi alternativi. In realtà io sono interessato a commutazione pile in un thread a livello utente in alcuni punti, ma sto vedendo che quando faccio swapcontext, ho difetti di segmentazione e poi ogni ora. Cosa dovrei fare?

voglio ottenere qualcosa di simile ...

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

Quindi, in questo caso, voglio usare una pila separata quando si esegue la funzione c.

+0

Molto difficile questione ;-P! Ancora nessun Aswers! – MetallicPriest

+0

Cosa stai cercando di usare 'makecontext'/etc per? Il loro scopo principale è l'attuazione biblioteche threading, che è una specie di sciocco, quando esistono già pthreads. – duskwuff

+0

@duskwuff, non sto usando per scopi filettatura. – MetallicPriest

risposta

9

causa delle limitazioni del pthread corrente, makecontext non deve essere usato in programmi che collegano contro il pthread (3) biblioteca

Questa sezione del manuale è valido per LinuxThreads, che ha usato per arrotondare %esp valore fino a trovare il descrittore di thread corrente. Questo (ovviamente) non produrrebbe un descrittore di thread valido se stavi eseguendo uno stack alternativo.

I LinuxThreads non sono più utilizzati da alcun Linux distribuito negli ultimi 5 anni e il {get,make,swap}context funziona correttamente con i thread NPTL.

EDIT: In realtà, vedo solo la "causa di limitazioni" in NetBSD docs, non in Linux docs.

quando lo faccio swapcontext, ottengo gli errori di segmentazione e poi ogni ora

Si dispone di un bug che si presenta come un errore di segmentazione di tanto in tanto. Non hai fornito abbastanza informazioni per indovinare dove potrebbe essere quel bug.

+1

Bello sapere che ora funziona. Grazie per la risposta EmployedRussian :-p! E sì, è stato davvero un bug che ho risolto ora. – MetallicPriest

Problemi correlati