Aines
20-01-2006, 17:55
Ho un piccolo problema (in realtà è un dramma) con il mio codice.
E' molto semplice: ho due processi, entrambi devono lavorare sullo stesso oggetto ma i cambiamenti fatti da uno di questi sono invisibili all'altro.
Non riporto tutto il codice perchè è molto lungo e comunque il problema è abbastanza semplice da poter essere astratto. Ecco qua:
int pid1, pid2;
MyObject *myObject = new Object(); // quest'oggetto ha un campo "nome"
void processoUno(void);
void processoDue(void);
int main(int argc, char *argv[])
{
int tpid, status;
strcpy(myObject->nome, "Mario");
pid1 = fork();
if(pid1 == 0) {
processoUno();
}
pid2 = fork();
if(pid2 == 0) {
processoDue();
}
tpid = wait(&status);
tpid = wait(&status);
return 0;
}
void processoUno()
{
strcpy(myObject, "Luca");
for(;;) {
// fa qualcosa
}
}
void processoDue()
{
cout << myObject->nome << endl; // ERRORE - mi aspetto di leggere Luca, invece leggo Mario...why? T_T
for(;;) {
// fa qualcosa
}
}
Ho pensato che forse quando processoDue() stampa il nome non era passato tempo sufficiente e processoUno() ancora non lo aveva cambiato, allora l'ho fatto dormire un pò tanto per essere sicuro, ma niente.
Mi sa proprio che il problema sta nella mia scarsa conoscenza del funzionamento delle system call.
I processi creati con fork hanno una copia del codice e dei dati del padre, ma pensavo che essendo myObject una variabile globale il problema non sussistesse...
Grazie per qualsiasi aiuto
E' molto semplice: ho due processi, entrambi devono lavorare sullo stesso oggetto ma i cambiamenti fatti da uno di questi sono invisibili all'altro.
Non riporto tutto il codice perchè è molto lungo e comunque il problema è abbastanza semplice da poter essere astratto. Ecco qua:
int pid1, pid2;
MyObject *myObject = new Object(); // quest'oggetto ha un campo "nome"
void processoUno(void);
void processoDue(void);
int main(int argc, char *argv[])
{
int tpid, status;
strcpy(myObject->nome, "Mario");
pid1 = fork();
if(pid1 == 0) {
processoUno();
}
pid2 = fork();
if(pid2 == 0) {
processoDue();
}
tpid = wait(&status);
tpid = wait(&status);
return 0;
}
void processoUno()
{
strcpy(myObject, "Luca");
for(;;) {
// fa qualcosa
}
}
void processoDue()
{
cout << myObject->nome << endl; // ERRORE - mi aspetto di leggere Luca, invece leggo Mario...why? T_T
for(;;) {
// fa qualcosa
}
}
Ho pensato che forse quando processoDue() stampa il nome non era passato tempo sufficiente e processoUno() ancora non lo aveva cambiato, allora l'ho fatto dormire un pò tanto per essere sicuro, ma niente.
Mi sa proprio che il problema sta nella mia scarsa conoscenza del funzionamento delle system call.
I processi creati con fork hanno una copia del codice e dei dati del padre, ma pensavo che essendo myObject una variabile globale il problema non sussistesse...
Grazie per qualsiasi aiuto