Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Multithreading in C
Forum - C/C++ - Multithreading in C

Avatar
comina8 (Normal User)
Pro


Messaggi: 86
Iscritto: 18/06/2011

Segnala al moderatore
Postato alle 16:09
Sabato, 18/06/2011
Ciao a tutti ho scritto questo semplice codice per iniziare la programmazione di Thread:


Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #include <process.h>
  5.  
  6. #include "mia_libreria.h"
  7.  
  8. bool esci=false;
  9. unsigned char x_b=1, y_b=1;
  10. unsigned char x_t=1, y_t=20;
  11.  
  12. void spara()
  13. {
  14.     unsigned char i, ausx=x_t;
  15.  
  16.     for(i=y_t-2;i>=1;i--)
  17.         {
  18.             delay(100);
  19.             gotoxy(ausx,i+1);
  20.             putchar(' ');
  21.             gotoxy(ausx,i);
  22.             putchar('*');
  23.         }
  24.     if(x_b==ausx)
  25.         {
  26.             gotoxy(0,0);
  27.             printf("Hai vinto!");
  28.             esci=true;
  29.         }
  30.     else
  31.         {
  32.             gotoxy(ausx,i);
  33.             putchar(' ');
  34.         }
  35.     chiudi_thread();
  36. }
  37.  
  38. void muovi_x()
  39. {
  40.     bool indietro;
  41.  
  42.     while(!esci)
  43.         {
  44.             delay(100);
  45.             if(indietro)
  46.                 {
  47.                     gotoxy(x_b,y_b);
  48.                     putchar(' ');
  49.                     x_b--;
  50.                     gotoxy(x_b,y_b);
  51.                     putchar('x');
  52.                 }
  53.             else
  54.                 {
  55.                     gotoxy(x_b,y_b);
  56.                     putchar(' ');
  57.                     x_b++;
  58.                     gotoxy(x_b,y_b);
  59.                     putchar('x');
  60.                 }
  61.             if(x_b==60)
  62.                 indietro=true;
  63.             else if(x_b==1)
  64.                 indietro=false;
  65.         }
  66.     chiudi_thread();
  67. }
  68.  
  69. int main()
  70. {
  71.     _beginthread(muovi_x,0,NULL);
  72.     unsigned char tasto;
  73.  
  74.     while(!esci)
  75.         {
  76.             tasto=getch();
  77.             if(tasto==27)
  78.                 esci=true;
  79.             else if(tasto==75)
  80.                 {
  81.                     gotoxy(x_t,y_t);
  82.                     putchar(' ');
  83.                     x_t--;
  84.                     gotoxy(x_t,y_t);
  85.                     putchar('_');
  86.                 }
  87.             else if(tasto==77)
  88.                 {
  89.                     gotoxy(x_t,y_t);
  90.                     putchar(' ');
  91.                     x_t++;
  92.                     gotoxy(x_t,y_t);
  93.                     putchar('_');
  94.                 }
  95.             else if(tasto==' ')
  96.                 {
  97.                     _beginthread(spara,0,NULL);
  98.                 }
  99.         }
  100.     return 0;
  101. }



Facendolo girare però ogni tanto viene stampata la 'x' o il trattino sbagliati
e soprattutto quando si sparano più colpi insieme vengono fatte delle stampe
assurde. Il codice mi sembra giusto, cosa posso aver sbagliato?

EDIT:

Scusa anthony015 ma ho premuto per sbaglio INVIO e non riesco a modificare.
Comunque penso di si perchè ogni thread usa variabili diverse.
Forse per iniziare potrei mettere come parametro alla funzione spara la x_t
almeno non devo più assegnarla ad ausx.
Provo poi ti dico.
Grazie comunque per la risposta =)

Ultima modifica effettuata da comina8 il 23/06/2011 alle 12:30
PM
Avatar
anthony015 (Member)
Pro


Messaggi: 116
Iscritto: 20/05/2011

Up
1
Down
V
Segnala al moderatore
Postato alle 1:40
Giovedì, 23/06/2011
sei sicura che venga rispettata la mutua esclusione(soltanto un thread alla volta deve poter accedere ad una variabile o zona di memoria condivisa)?

Prima di tutto sono sicurO =) - comina8 - 23/06/11 12:19
Ecco ora va di nuovo. Leggi l'edit. - comina8 - 23/06/11 12:23
Nada sempre uguale. =( - comina8 - 23/06/11 12:31
innanzitutto scusa per averti dato del lei, ma il nome mi ha tratto in inganno... comunque x_b è usata sia in spara che muovi, y_t sia in main che in spara e x_t nel main e in spara, ma è molto difficile che su di essa vengano effettuati più accessi simultaneamente - anthony015 - 23/06/11 14:03
Figurati =). Comunque ho provato a passarli come parametri ma niente da fare. A dirti la verità mi sembra che un po' meglio vada però il problema persiste..-.-" - comina8 - 23/06/11 18:50
Ulteriore problema: ogni tanto anche la 'x' o il '_' vengono stampati senza cancellarli o in modo strano quindi dev'essere un problema di gotoxy magari, che passando i parametri ogni tanto li confonde o se ne dimentica qualcuno. Provo a scrivere il codice per intero speriamo si modifichi qualcosa. - comina8 - 23/06/11 18:53
anche gotoxy e putchar dovrebbero fare parte di una sezione critica... - anthony015 - 23/06/11 19:00
La gotoxy l'ho scritta per intero e da sempre lo stesso probleme. Per quanto riguarda la putchar come dovrei fare (comunque sbaglia a stamparmi nelle coordinate non cosa stampa) - comina8 - 23/06/11 19:44
per ogni sezione critica dovresti usare un opportuno algoritmo per la mutua esclusione, http://it.wikipedia.org/wiki/Categoria:Algoritmi_di_mutua_esclusione - anthony015 - 23/06/11 20:22
E ma come posso implementarlo? Cioè devo eseguire un'istruzione alla volta per ogni processo? Anche perché non so qual'è la zona critica quindi piuttosto faccio eseguire in sequenza ogni istruzione bloccando la CPU su un'istruzione alla volta come "voglio io"... - comina8 - 23/06/11 20:43
la sezione critica è http://it.wikipedia.org/wiki/Sezione_critica , in parole povere una parte di un processo che accede a dati condivisi con altri processi, quelli che ti ho linkato prima sono dei possibili algoritmi per garantire che non accada casino quando 2 o più processi(o thread)->segue sotto - anthony015 - 23/06/11 20:58
tentano di accedere contemporaneamente ad una risorsa condivisa, che come puoi ben capire viene a crearsi un bel problema se 2 processi accedono/modificano una variabile allo stesso tempo, per l'implementazione è puoi seguire wikipedia, che mi pare molto chiara... - anthony015 - 23/06/11 21:00
PM