Ostream di log

di il
3 risposte

Ostream di log

Buongiorno a tutti,

Ho un piccolo dubbio: sto creando una classe che deve scrivere su uno stream di log, ma nel caso questo non gli venga passato nel costruttore allora va a scrivere sullo std::cout.
Per farlo ho fatto in modo di salvare come proprietà della classe uno stream output e di farmi passare nel costruttore uno std::strembuff *.

es:
class es {
    std::ostream log;
    
public:
    es(std::streambuff *logBuffer = std::cout.rdbuf()) : log(logBuffer);
}
Spero che dal codice risulti chiaro il procedimento....
Il dubbio che ho è: io posso comunque scrivere su due stream che puntano allo stesso buffer senza timore che il programma vada in deadlock? la sincronizzazione è gestita dal sistema operativo?

3 Risposte

  • Re: Ostream di log

    Il sistema operativo sincronizza i processi, ma all'interno dello stesso processo la sincronizzazione è a carico dell'utente.
    Nel tuo caso lettura e scrittura sono sincronizzate all'interno delle api del runtime C/C++ (ovviamente parlo di runtime MT), ma l'ordine di lettura/scrittura non è garantito. Se vuoi garanzie sull'ordine ci devi pensare tu, specie se usi gli operatori <<
  • Re: Ostream di log

    Ok, quindi se ho capito bene: è possibile che io trovi il buffer riempito un in disordine, ma è garantito dalle API che il programma non andrà in deadlock. Ho capito bene?
  • Re: Ostream di log

    Si. L'unico modo per avere un deadlock è che l'api non rilasci il mutex intorno alla funzione di lettura/scrittura, ma un'api del genere sarebbe sgamata in 0,1 secondi dato che fa parte del compilatore.
Devi accedere o registrarti per scrivere nel forum
3 risposte