PDA

View Full Version : [C] verifica sospensione threads


carlo98
15-04-2009, 15:30
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

carlo98
16-04-2009, 14:45
continuo a cercare e a chiedere ma ancora nulla... sono lontano dalla soluzione
qui
http://publib.boulder.ibm.com/iseries/v5r2/ic2924/index.htm?info/apis/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

BrutPitt
16-04-2009, 16:03
continuo a cercare e a chiedere ma ancora nulla... sono lontano dalla soluzione
qui
http://publib.boulder.ibm.com/iseries/v5r2/ic2924/index.htm?info/apis/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

Magari non ho ben compreso io la tua richiesta... ma proprio di seguito al tuo link c'e' un esempio che fa proprio quello che dice la frase "incriminata" :) :


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;
...

carlo98
16-04-2009, 16:16
ok, questo dimostra che mi stavo fondendo il cervello:doh:
chiedo scusa per averti (e avervi) fatto perdere tempo...nn me ne ero accorto:D

grazie davvero

carlo98
19-04-2009, 10:58
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;
...


ok questo funziona.... ance se gettimeoftheday mi dā un warning di funzione implicitamente definita
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!