Bonjour!
Je me permet de poster une question qui me pourri l'esprit depuis longtemps.
J'ai mis le code en annexe.
Mon probleme:
J'ai cree une classe de "communication" interprocessus afin de regrouper et de simplifier les problemes de mutex et de stocker la variable partagee.
Dans mes threads, je desire utiliser cette classe de communication. Je n'ai pas trouve d'autre solution que de faire passer un pointeur de l'instance de ma classe communication via l'argument de creation de thread.
Y aurait-il une solution plus elegante? Je ne desire pas creer de variable globale de l'instance de ma classe de communication.
J'avais pense mettre la variable partagee de ma classe communication en statique, et creer une nouvelle classe (qui heriterait de cette classe communication) et qui gererait les threads. Mais ca me semble plus lourd.
Qu'en pensez-vous?
Merci pour vos reponses :-)
JC
classe de communication
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 #include <pthread.h> class comu { public: comu(); ~comu(){}; void add_value (int val); int retrieve_value(); private: int v; pthread_mutex_t mutex; }; comu::comu() { v=0; pthread_mutex_init(&mutex,NULL); } void comu::add_value(int val) { pthread_mutex_lock(&mutex); v+=val; pthread_mutex_unlock(&mutex); } int comu::retrieve_value() { int val; pthread_mutex_lock(&mutex); val=v; pthread_mutex_unlock(&mutex); return val; }
main
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 #include <iostream> #include "comu.cpp" int val1=3; int val2=6; void * func1 (void * dummy) { while(true) { comu * c=(comu *) dummy; std::cout << "Thread 1 adds 3 to the value" << std::endl; c->add_value(3); sleep (2); val1--; if (val1==0) { std::cout<<"Thread 1 exit!"<<std::endl; pthread_exit(NULL); } } } void * func2 (void * dummy) { while(true) { comu * c=(comu *) dummy; std::cout<<"Thread 2 reads the value: "<< c->retrieve_value()<< std::endl; sleep(1); val2--; if (val2==0) { std::cout<<"Thread 2 exit!"<<std::endl; pthread_exit(NULL); } } } int main() { comu * pcomu=new(comu); std::cout<<"Init value="<<pcomu->retrieve_value()<<std::endl; pthread_t t1,t2; pthread_create(&t1,NULL,func1,(void *)pcomu); pthread_create(&t2,NULL,func2,(void *)pcomu); pthread_join(t1,NULL); pthread_join(t2,NULL); std::cout<<"Final value="<<pcomu->retrieve_value()<<std::endl; delete (pcomu); return 0; }
Partager