IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Threads & Processus C++ Discussion :

acces adresse mémoire commune


Sujet :

Threads & Processus C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut acces adresse mémoire commune
    Bonjour,
    j'essaye de faire un système multi thread avec calcul du tps restant, et lecture de ce temps sur commande.

    Voilà mon code épuré pour le post :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    //Thread.h
     
    struct Thread_info {
    	struct arg			arg;
    	pthread_t			thread;
    	pthread_mutex_t		mutex;
    	long*				remaining_time;
    };
     
    class Thread{
    private: 
    	struct Thread_info	Thread_info;	
    	static void*		Thread::Thread_function(void* arg);
     
    public:    
    	int			Start();
    	long		getRT();
    };
     
    //Thread.cpp
     
    void* Thread::Thread_function(void* arg){
    	Thread *thread = (Thread*) arg;
    		process_1(&(thread->Thread_info.mutex),thread->Thread_info.remaining_time);	
    	return NULL;
    }
     
    int Thread::Start(){
    	this->Thread_info.mutex = PTHREAD_MUTEX_INITIALIZER;
    	if ( pthread_create( &(this->Thread_info.thread), NULL,Thread::Thread_function,(void *)this) ){
    		printf("error creating thread.");
    		return 1;
    	}
    	return 0;
    }
     
    long Thread::getRT(){
    	long ii;
    	pthread_mutex_lock(&(this->Thread_info.mutex));
    	ii = *(this->Thread_info.remaining_time);
    	pthread_mutex_unlock(&(this->Thread_info.mutex));
    	return ii;
    }
     
    int process_1( pthread_mutex_t* mutex, long* remaining_time)
    {
    	int N = 30;
    	time_t t1, t2, t3;
    	t1 = time(NULL);
    	for (int ii = 0;ii<N;ii++)
    	{
    		Sleep(1000); //traitement
    		t2 = time(NULL);
    		t3=(N-ii-1)*(t2-t1)/(ii+1);
    		cout<<t3<<endl;
    		pthread_mutex_lock(mutex);
    		*remaining_time = (long)t3;
    		pthread_mutex_unlock(mutex);
    	}
    	return 0;
    }
     
    //main.cpp
     
    void main()
    {
    	char num[3];
    	int num_function, a;
    	long b;
     
    	Thread *tab_Thread;
    	tab_Thread = new Thread[50];
     
    	int ii=0;
    	while (1){
    	cout<<"Lequel ?"<<endl;
    	cout<<" 1: lancer thread.\n 2: get time"<<endl;
    	cin >> num;
    	sscanf(num, "%d", &num_function);
    	if (num_function==1){
    			ii++;
    			a = tab_Thread[ii].Start();
    			cout<<a<<endl;
    	}
    	else
    		if (num_function==2){
    			b = tab_Thread[ii].getRT();
    			cout<<b<<endl;
    			//delete *tab_Thread[ii];
    		}
     
    }
    Voila pour le code. Donc en gros je lance un thread et pendant son execution j'appel getRT(). Sauf qu'il me renvoie toujours la valeur : -858993460.

    Pourtant, dans mon code (pas apaprent ici), dans process_1 je fais exactement la meme chose avec un char** en assignant par exemple: *a = "toto". Et avec la fonction qui va bien je peux très bien lire cette variable et obtenir "toto".

    Voilà, est ce que vous auriez une explication ?

    Merci par avance.

  2. #2
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    C'est bon j'ai trouvé la solution.

    En fait mon pointeur vers remaining_time etait initialisé seulement à partir de la sous fonction. Sa portée était donc réduite. J'ai donc remplacé partout remaining_time, le long* par un long et pouf tout marche magiquement.

Discussions similaires

  1. Réponses: 16
    Dernier message: 30/05/2006, 18h46
  2. lire la valeur d'une adresse mémoire
    Par ilimo dans le forum Windows
    Réponses: 17
    Dernier message: 11/04/2006, 15h21
  3. PRoblème d'adresse mémoire
    Par pmboutteau dans le forum Access
    Réponses: 11
    Dernier message: 07/04/2006, 11h00
  4. Acces à la mémoire
    Par Ulmo dans le forum C
    Réponses: 5
    Dernier message: 15/10/2005, 17h32
  5. Réponses: 6
    Dernier message: 19/09/2005, 19h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo