Il modo più efficiente / più pulito di uccidere un filo ricorsivo in modo sicuro

3

Ho un numero di thread di lavoro che eseguono tutti un'attività di riempimento in pieno su diverse regioni di una bitmap. Fanno tutte le chiamate a una sub-routine ricorsiva con diversi parametri (coordinate). Fyi, sto usando un metodo di scansione. Ho implementato una funzionalità di ripristino che mira a eliminare questi processi in modo che possano ricominciare.

Il modo in cui attualmente ho implementato il mio meccanismo di uccisione, consiste nell'usare un evento kill con reset manuale e rendere la subroutine flood-fill restituita se viene segnalata. In questo modo, i fili continueranno a visitare un numero considerevole di punti sulla regione a cui sono limitati, prima di abbandonare beato, ma comunque saltare l'operazione di riempimento pertinente. Mi stavo chiedendo se c'è un modo più efficiente per farlo.

P.S. Sì, lo so che è un over-kill per flood-fill, ma questa è una domanda generale. Si potrebbe immaginare una matrice in cui si desidera eseguire alcune costose operazioni locali basate su alcune condizioni locali e utilizzare una routine ricorsiva della stessa natura di un approccio scanline.

EDIT: Ecco il design attuale del mio framework:

m_pThread[i] = AfxBeginThread(FloodFill_Sub_ThreadProc, (LPVOID)m_pFloodFillInput[i], 0, 0, CREATE_SUSPENDED);

con threadprocedures definito come:

UINT CTestShellDlg::FloodFill_Sub_ThreadProc(LPVOID pData)
{
...
FloodFill_Sub(mid, mid, Color_old, Color_new);
}

e infine FloodFill_Sub:

void CTestShellDlg::FloodFill_Sub(CPoint& node, CPoint& mid, COLORREF Color_old, COLORREF Color_new) /*Sub-routine to be used by threads*/
{
if (KillEventTriggered())
        return;
if (RecursionTerminationCondition)
        return;
//loop some scans and make recursive calls to FloodFill_Sub
...
}

Ora nella sezione del ciclo, si potrebbero aggiungere ulteriori controlli KillEventTriggered (), ma mi chiedo se potrebbe esserci un approccio migliore.

    
posta Maths noob 18.12.2014 - 03:23
fonte

1 risposta

5

Non esiste un modo pulito e sicuro per "uccidere" un thread in modo rapido / efficiente. È possibile segnalare all'oggetto thread che deve essere terminato, ma il thread deve essere scritto in modo tale che controlli questo e poi si ripulisca. Altrimenti, si può finire parzialmente operazioni completate, perdite di memoria, perdite di risorse, deadlock e tutti i tipi di caos nel tuo programma.

Indipendentemente dal fatto che i thread coinvolti eseguano un'operazione ricorsiva e che i sottoprocessi di spawning non cambino questo principio di base.

    
risposta data 18.12.2014 - 03:52
fonte

Leggi altre domande sui tag