|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Apr 2009
Messaggi: 6
|
[C] verifica sospensione threads
Salve a tutti,
è la prima volta che scrivo in questo forum, spero di aver postato nella sezione giusta ho scritto una soluzione in linguaggio C al problema classico produttori/consumatori il programma compila e funziona ora il problema è che devo verificare che un consumatore che tenta di leggere da un buffer vuoto resti in attesa di una scrittura da parte di un produttore. Ovviamentee questo deve avvenire perchè le letture devono essere bloccanti. Il mio prof ha detto di mettere un flag (che viene modificato se il consumatore effettua la lettura) e verificare, dopo un tempo stabilito di attesa che il flag non è cambiato... in altre parole devo fare in modo che dopo un tempo stabilito (abbastanza grande da essere sicuro che il thread è sospeso indefinitivamente) il consumatore deve bloccarsi e restituire un valore e il controllo al processo main (che controllerà il flag) io ho usato i sem_t con i threads in C..ho cercato parecchio e ho trovato la primitiva sem_timedwait(semaforo, timespec) ora le domande sono: questa primitiva appartiene ai posix threads di linux (gira su qualsiasi linux)? (lo chiedo perchè a lezione questa primitiva non è stata presentata) -come va utilizzata? in particolare il time spec indica un tempo assoluto, come posso cambiarlo in un intervallo di tempo (tipo 10 secondi a partire da adesso) chiedo scusa se ho scritto errori, e vi ringrazio per ogni eventuale risposta |
|
|
|
|
|
#2 |
|
Junior Member
Iscritto dal: Apr 2009
Messaggi: 6
|
continuo a cercare e a chiedere ma ancora nulla... sono lontano dalla soluzione
qui http://publib.boulder.ibm.com/iserie...s/users_77.htm ho trovato questa frase The current absolute system time can be retrieved as a timeval structure using the software clock interface gettimeofday(). The timeval structure can easily have a delta value added to it and be converted to a timespec structure purtroppo non trovo in rete come si fa.... suggerimenti???? in ogni caso grazie |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Mar 2009
Città: Bologna
Messaggi: 1174
|
Quote:
Codice:
struct timespec ts;
struct timeval tp;
...
rc = gettimeofday(&tp, NULL);
checkResults("gettimeofday()\n", rc);
/* Convert from timeval to timespec */
ts.tv_sec = tp.tv_sec;
ts.tv_nsec = tp.tv_usec * 1000;
ts.tv_sec += WAIT_TIME_SECONDS;
...
|
|
|
|
|
|
|
#4 |
|
Junior Member
Iscritto dal: Apr 2009
Messaggi: 6
|
ok, questo dimostra che mi stavo fondendo il cervello
chiedo scusa per averti (e avervi) fatto perdere tempo...nn me ne ero accorto grazie davvero |
|
|
|
|
|
#5 |
|
Junior Member
Iscritto dal: Apr 2009
Messaggi: 6
|
Codice:
struct timespec ts;
struct timeval tp;
...
rc = gettimeofday(&tp, NULL);
checkResults("gettimeofday()\n", rc);
/* Convert from timeval to timespec */
ts.tv_sec = tp.tv_sec;
ts.tv_nsec = tp.tv_usec * 1000;
ts.tv_sec += WAIT_TIME_SECONDS;
...
mi sono messo anche a vedere come terminare un thread sospeso ed ho trovato pthread_cancel solo che ho un comportamento strano 1- se lo invoco su un thread sospeso (consumator che non trova niente da consumare) mi restituisce 0 (e fin qui tutto bene) 2. se lo invoco su un thread già terminato (per esempio se il consumatore ha consumato un dato e quindi non è sospeso) mi restituisce 3 (e questo proprio non lo capisco...????) aiuto! |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:37.




















