Domanda

Ho un problema nella comprensione di come il lavoro variabili di condizione winapi.

Dal punto di vista più specifico, quello che voglio è un paio di thread in attesa a una certa condizione. Poi voglio utilizzare la chiamata WakeAllConditionVariable () per svegliare tutti i fili in modo che possano fare il lavoro. Oltre al fatto che voglio solo le discussioni iniziate, non c'è nessun altro prerequisito per loro di iniziare a lavorare (come si avrebbe in un / n scenario del consumatore n produttore).

Ecco il codice finora:

#define MAX_THREADS 4

CONDITION_VARIABLE  start_condition;
SRWLOCK            cond_rwlock;
bool                  wake_all;

__int64 start_times[MAX_THREADS];

thread principale:

int main() 
{
    HANDLE h_threads[ MAX_THREADS ];

    int tc;
    for (tc = 0; tc < MAX_THREADS; tc++)
    {
        DWORD tid;
        h_threads[tc] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread_routine,(void*)tc,0,&tid);
        if( h_threads[tc] == NULL )
        {
            cout << "Error while creating thread with index " << tc << endl;
            continue;
        }
    }

    InitializeSRWLock( &cond_rwlock );
    InitializeConditionVariable( &start_condition );

    AcquireSRWLockExclusive( &cond_rwlock );
        // set the flag to true, then wake all threads
    wake_all = true;
    WakeAllConditionVariable( &start_condition );

    ReleaseSRWLockExclusive( &cond_rwlock );

    WaitForMultipleObjects( tc, h_threads, TRUE, INFINITE );

    return 0;
}

E qui è il codice per la routine filo:

DWORD thread_routine( PVOID p_param )
{
    int t_index = (int)(p_param);

    AcquireSRWLockShared( &cond_rwlock );

        // main thread sets wake_all to true and calls WakeAllConditionVariable()
        // so this thread should start doing the work (?)
    while ( !wake_all )
        SleepConditionVariableSRW( &start_condition,&cond_rwlock, INFINITE,CONDITION_VARIABLE_LOCKMODE_SHARED );

    QueryPerformanceCounter((LARGE_INTEGER*)&start_times[t_index]);
        // do the actual thread related work here

    return 0;
}

Questo codice non fa quello che mi sarei aspettato di fare. A volte basta un filo finisce il lavoro, a volte due o tre, ma mai tutti. La funzione principale non viene mai oltre i WaitForMultipleObjects () chiamata.

Non sono esattamente sicuro di cosa ho fatto di sbagliato, ma vorrei assumere qualche problema di sincronizzazione da qualche parte?

Qualsiasi aiuto sarebbe apprezzato. (Scusate se ho ri-postato argomento più anziani con diverso spogliatoio :)

È stato utile?

Soluzione

inizializzare le variabili cond_rwlock e start_condition troppo tardi. Spostare il codice up, prima si avvia il thread. Un thread è probabile che iniziare a correre subito, specialmente su una macchina multi-core.

e testare i valori di ritorno delle funzioni API. Tu non sai perché non funziona perché non hai mai verificate per il fallimento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top