Newsgroup: it.comp.lang.c++
Titolo: processi e variabili statiche

Ciao!
Ho un problema che probabilmente e' piuttosto banale, ma che mi sta
facendo perdere un bel po' di tempo. Ho tentato di formalizzarlo, per
renderlo piu' comprensibile.
#include <iostream.h>
#include <unistd.h>
void stat() {
  static int i = 0;
  cout << i << endl;
  i ++;
}
int main() {
  int pid = fork();
  if(pid == 0) {
    stat();
    stat();
    stat();
  }
  else {
    stat();
    stat();
    stat();
  }
  sleep(1);
}
L'output di questo programma e' sempre nella forma 012012, oppure
001212, o simili, in quanto i due processi generati dalla funzione
fork() non condividono la stessa variabile statica i.
Come si deve definire i per rendere l'output del programma pari a
012345?
Come si definisce cioe' una variabile statica comune a piu' processi?

 Come si definisce cioe' una variabile statica comune a piu' processi?
Ciao
C++ come molti altri linguaggi non offre costrutti specifici per la 
gestione dei thread e dei processi, la libreria del C che puo' essere 
utilizzata in c++, ti aiuta nelle funzioni di base (ad esempio la fork 
che tu hai usato per clonare il processo). Quello che ti serve nel tuo 
caso e' la possibilità di utilizzare un'area di memoria condivisa 
(SharedMemory) e fare riferimento a quell'area per memorizzare le 
variabili che devi condividere tipicamente in maniera mutualmente 
esclusiva.  Tutto questo e nel dominio del Sistema Operativo e non del 
linguaggio.
Se le API del sistema operativo non sono il tuo forte un possibile 
approccio alternativo (poco elegante ma funziona) e' quello di 
utilizzare un file come area di memoria condivisa. In pratica ogni 
processo legge da file e scrive l'informazione aggiornata sul file una 
volta terminata l'elaborazione.
Attenzione gli accessi al file devono pero' essere serializzati, 
altrimenti potresti ottenere degli effetti indesiderati causati 
dall'accesso concorrente. Ancora l'approccio piu' banale e' quello di 
aprire e chiudere il file appena hai finito di scrivere avendo cura in 
apertura di specificare i flag per l'accesso esclusivo.
Hope this help
Fede

 Come si definisce cioe' una variabile statica comune a piu' processi?
su it.comp.os.linux.developement
Il C++ standard non sa nemmeno dove stanno di casa più processi.
-- 
[ RiK0                                ]
[ Go away! The internet is full!      ]
[ Non credo negli schemi non vincenti ]

Grazie mille per l'aiuto :)
Avevo in effetti pensato anch'io alla scrittura del valore della
variabile in un file, come ultima risorsa, anche se speravo che ci
fosse un costrutto gia' pronto, che permettesse di definire una
variabile in uno spazio di memoria condiviso dai processi.
Le API di sistema non le conosco, per quella soluzione provero' magari
a postare su linux.development.
Mi potreste dare un esempio di accesso esclusivo in lettura e in
scrittura ad un file, please? Quali flag vanno utilizzati?
I processi concorrenti, nel mio caso concreto, saranno piu' o meno una
cinquantina. In pratica devo memorizzare un timestamp, in modo da
temporizzare opportunamente una serie di upload gestiti da processi
figli.
Speriamo bene, non vorrei che i tempi di attesa per un accesso
mutuamente esclusivo al file diventassero eccessivi, scombinando la
temporizzazione.

 scrittura ad un file,
Anche quello di "accesso esclusivo" è un concetto che esula dal C/C++ 
standard e appartiene invece al dominio del sistema operativo.
Negli standard del C e del C++ non si parla di processi concorrenti né di 
thread. Non si parla nemmeno della funzione 'fork' (anche se il messaggio 
di Federico poteva suggerire diversamente).
Nel tuo caso, la strada da seguire è quella della memoria condivisa. In 
alternativa, puoi usare i thread e contare sulla condivisione implicita 
della memoria. Anche in questo caso, il C/C++ standard non ti aiuta. Prima 
di postare su it.comp.os.linux.development, però, dovresti leggerti un po' 
di documentazione.
Max

 temporizzazione.
Senti, chiedi su it.comp.os.linux.developemnt. COn la IPC Posix te la
puoi cavare molto meglio.
Il fatto che qui non se ne parli č solo dovuto al fatto che non centra
con C++ standard (non che non si possa usare in C++).


Ok ho capito.
Per chi passasse di qua e fosse interessato all'argomento, aggiungo
che il thread su it.comp.os.linux.development si chiama "variabili
statiche nella shared memory", l'ho aperto il 16/01/05
Ciao grazie.