Utilizzo trylock:Come usare pthread_mutex_trylock?
FILE *fp;
pthread_mutex_t demoMutex;
void * printHello (void* threadId)
{
pthread_mutex_trylock (&demoMutex);
pthread_t writeToFile = pthread_self();
unsigned short iterate;
for (iterate = 0; iterate < 10000; iterate++)
{
fprintf (fp, " %d ", iterate, 4);
fprintf (fp, " %lu ", writeToFile, sizeof (pthread_t));
fprintf (fp, "\n", writeToFile, 1);
}
pthread_mutex_unlock (&demoMutex);
pthread_exit (NULL);
}
e poi main():
int main()
{
pthread_t arrayOfThreadId [5];
int returnValue;
unsigned int iterate;
fp = fopen ("xyz", "w");
pthread_mutex_init (&demoMutex, NULL);
for (iterate = 0; iterate < 5; iterate++)
{
if (returnValue = pthread_create (&arrayOfThreadId [iterate],
NULL,
printHello,
(void*) &arrayOfThreadId [iterate]) != 0)
{
printf ("\nerror: pthread_create failed with error number %d", returnValue);
}
}
for (iterate = 0; iterate < 5; iterate++)
pthread_join (arrayOfThreadId [iterate], NULL);
return 0;
}
Qui l'uscita prima stampa alcune del primo filetto e il resto, e poi di nuovo la prima. Il blocco non funziona. Se sostituisco lo stesso con pthread_mutex_lock
ogni cosa viene mostrata molto in sequenza!
Qual è l'errore ridicolo qui?
Per curiosità, puoi fornire un esempio in cui '..._ lock()' è preferito a '..._ trylock()'? Ex. se si vuole implementare un timeout, non sarebbe 'trylock' la scelta? O non ha senso fare un timeout? – theMayer
'..._ lock()' è l'opzione appropriata nella maggior parte dei casi, perché nella maggior parte dei casi, il thread non può fare progressi utili in avanti senza prendere il mutex. In questo caso, se viene usato un '... trylock()' e non può prendere il lucchetto, l'unica opzione è di aggirare e tentare di bloccarlo di nuovo. I timeout devono essere richiesti solo nei casi in cui è richiesto un evento esterno per il progresso in avanti, che tende a mappare una variabile di condizione e quindi è possibile utilizzare 'pthread_cond_timedwait()'. Un'attesa illimitata su un mutex indica un problema nel codice stesso piuttosto che una condizione eccezionale. – caf
Sono d'accordo con l'ultima frase ... Ho qualche codice legacy in cui lo sviluppatore è diventato un po 'troppo ambizioso e forse non ha capito come funziona il threading. Il codice sta anche tentando di sospendere il thread per un singolo millisecondo alla volta. Devi ridere, altrimenti ti fa piangere! – theMayer