2011-08-19 15 views
5

Esistono più thread che lavorano su un'attività. Una volta che un thread ha avuto successo, tutto il thread dovrebbe essere annullato, poiché il lavoro è stato completato. Come posso cancellare gli altri thread una volta che un thread è terminato con successo? Chi chiamerà lo pthread_cancel() e in che modo il thread di successo indicherà main o il thread che lo ha generato (valore restituito?).Annulla il thread POSIX al termine di un lavoro comune

UPDATE

Non voglio chiamare semplicemente exit come voglio ora un certo controllo. Ad esempio, dopo che i thread sono stati cancellati, elaborerò il risultato trovato dal thread che ha avuto successo e sarà possibile eseguire qualche altra elaborazione, o semplicemente voler mantenere il processo in esecuzione per un po 'più di lavoro.

+0

Perché hai bisogno di più thread per questa attività, se hai intenzione di buttare via il lavoro fatto da tutti tranne uno di loro? Basta fare il lavoro una volta in una discussione. – zwol

+2

dico, ho una lista enorme da cercare linearmente, passerò segmenti di liste a thread diversi, e una volta che si trova una corrispondenza, ritorna. altri sono cancellati. – phoxis

+0

Immagino che abbia senso in un contesto in cui una ricerca di forza bruta è l'unica opzione, ma se si dispone di una qualsiasi struttura nei dati, ci sono algoritmi migliori. – zwol

risposta

4

È possibile scegliere uno schema semplice in cui main fa tutto.

Avere main avviare tutti i thread e fare un down su qualche semaforo. Quando un thread finisce l'attività, fai un up su quel semaforo. Quando il sistema principale è sbloccato, è possibile eseguire tutti i thread su pthread_cancel (e quindi su pthread_join).

In questo modo main avvia e arresta tutti i thread, quindi dovrebbe essere piuttosto semplice.

+0

sì, il mio design è basato su uno principale e, questa è una buona idea. Qualcosa potrebbe essere fatto con i segnali? – phoxis

+0

@phoxis Per sicurezza, è possibile inviare un segnale a un thread usando 'pthread_kill'. Sempre in questa regola penso che sarebbe disordinato (non riesco a pensare a un modo semplice di lasciare il thread da un gestore di segnale). Ma non fidarti della mia parola, evito sempre i segnali. – cnicutar

+0

nel caso di figli principali di spawn, mi piace la soluzione mutex, e lo userò. Ho chiesto dei segnali quando è il caso che i thread vengano generati in modo ricorsivo o casuale senza alcun genitore comune, in quel caso i segnali potrebbero funzionare. O c'è un altro modo per gestire l'annullamento di tale deposizione casuale? – phoxis

1

Un modo semplice è chiamare exit() che termina il processo insieme a tutti i thread. Può essere chiamato da qualsiasi thread.

Un altro modo è quello di avere il vostro uova thread principale e attendere sui thread di lavoro, e una volta che uno dei thread di lavoro ha portato a termine uno:

  • dire piacevolmente gli altri thread per terminare e aspettare che lo fanno, oppure
  • all'improvviso pthread_cancel() loro. Per impostazione predefinita, i thread vengono creati con PTHREAD_CANCEL_DEFERRED, il che significa che non verranno interrotti fino a quando non vengono richiamate nessuna delle funzioni del punto di annullamento, vedere Thread Cancellation per una buona descrizione. Pertanto, se i thread eseguono calcoli lunghi, è possibile impostare lo stato di annullamento su PTHREAD_CANCEL_ASYNCHRONOUS per terminare immediatamente la discussione, vedere pthread_setcanceltype.
+0

sì, questo è un modo che stavo usando fino a prima di postare questo, ma voglio ora un po 'più di controllo. Ad esempio, dopo che i thread sono stati cancellati, elaborerò il risultato trovato dal thread che ha avuto successo e sarà possibile eseguire ulteriori elaborazioni. – phoxis

+0

vedere l'aggiornamento quindi :) –

+0

Qualcosa potrebbe essere fatto con i segnali? – phoxis

Problemi correlati