Je sais que le groupe n'est pas le plus adapté (et encore),
mais vous etes "sympas" compétents et francophones.
Je me sers d'une condition pour faire une "sorte" de sémaphore.
class RXEngine {
.../...
POSIXThread condition;
.../...
};
appelé par le thread "ordonnanceur" pour (re)donner la priorité au th read
"traitement"
//sans commentaire
void RXEngine::is_priority() {
mutex_priority.lock();
bool _priority = priority;
mutex_priority.unlock();
return _priority;
}
appelé par le thread "ordonnanceur" pour donner la priorité au thread
"traitement"
void RXEngine::set_priority() {
mutex_priority.lock();
if(!priority) {
priority = true;
condition.signal();
}
mutex_priority.unlock();
}
appelé par le thread "ordonnanceur" pour retirer la priorité
au thread "traitement"
void RXEngine::wait() {
mutex.lock();
mutex_priority.lock();
priority = false;
mutex_priority.unlock();
mutex.unlock();
}
Pendant le traitement ce code est évalué en "boucle"
.../...
if(!isPriority()) {
timer.wait();
condition.wait();
timer.restart();
}
.../...
Ce code me donne satisfaction (enfin presque sinon il n'y
aurai pas de question)
A la première utilisation mon thread traitement ne s'arrête
pas, il faut attendre le deuxième passage. Apres ça baigne.
Que se passe t'il?
Comment régler cela?
Je sais que le groupe n'est pas le plus adapté (et encore),
mais vous etes "sympas" compétents et francophones.
Je me sers d'une condition pour faire une "sorte" de sémaphore.
class RXEngine {
.../...
POSIXThread condition;
.../...
};
appelé par le thread "ordonnanceur" pour (re)donner la priorité au th read
"traitement"
//sans commentaire
void RXEngine::is_priority() {
mutex_priority.lock();
bool _priority = priority;
mutex_priority.unlock();
return _priority;
}
appelé par le thread "ordonnanceur" pour donner la priorité au thread
"traitement"
void RXEngine::set_priority() {
mutex_priority.lock();
if(!priority) {
priority = true;
condition.signal();
}
mutex_priority.unlock();
}
appelé par le thread "ordonnanceur" pour retirer la priorité
au thread "traitement"
void RXEngine::wait() {
mutex.lock();
mutex_priority.lock();
priority = false;
mutex_priority.unlock();
mutex.unlock();
}
Pendant le traitement ce code est évalué en "boucle"
.../...
if(!isPriority()) {
timer.wait();
condition.wait();
timer.restart();
}
.../...
Ce code me donne satisfaction (enfin presque sinon il n'y
aurai pas de question)
A la première utilisation mon thread traitement ne s'arrête
pas, il faut attendre le deuxième passage. Apres ça baigne.
Que se passe t'il?
Comment régler cela?
Je sais que le groupe n'est pas le plus adapté (et encore),
mais vous etes "sympas" compétents et francophones.
Je me sers d'une condition pour faire une "sorte" de sémaphore.
class RXEngine {
.../...
POSIXThread condition;
.../...
};
appelé par le thread "ordonnanceur" pour (re)donner la priorité au th read
"traitement"
//sans commentaire
void RXEngine::is_priority() {
mutex_priority.lock();
bool _priority = priority;
mutex_priority.unlock();
return _priority;
}
appelé par le thread "ordonnanceur" pour donner la priorité au thread
"traitement"
void RXEngine::set_priority() {
mutex_priority.lock();
if(!priority) {
priority = true;
condition.signal();
}
mutex_priority.unlock();
}
appelé par le thread "ordonnanceur" pour retirer la priorité
au thread "traitement"
void RXEngine::wait() {
mutex.lock();
mutex_priority.lock();
priority = false;
mutex_priority.unlock();
mutex.unlock();
}
Pendant le traitement ce code est évalué en "boucle"
.../...
if(!isPriority()) {
timer.wait();
condition.wait();
timer.restart();
}
.../...
Ce code me donne satisfaction (enfin presque sinon il n'y
aurai pas de question)
A la première utilisation mon thread traitement ne s'arrête
pas, il faut attendre le deuxième passage. Apres ça baigne.
Que se passe t'il?
Comment régler cela?
Deux choses à vérifier. D'abord, que le pthread_cond_t est bien
initialisé AVANT le premier appel à pthread_cond_wait, et
deuxièmement, que tu detiens toujours le mutex chaque fois que
tu appelles pthread_cond_wait.
C'est quoi, POSIXThread. Est-ce qu'il s'agit ici d'un wrapper
pour un pthread_cond_t, ou... ?
Et il n'y a pas de groupe Posix francophone où les gens sont
aussi sympas et compétents ?
Appeler pthread_cond_wait sans avoir contrôle du mutex donne un
comportement indéfini, selon la norme Posix.
Deux choses à vérifier. D'abord, que le pthread_cond_t est bien
initialisé AVANT le premier appel à pthread_cond_wait, et
deuxièmement, que tu detiens toujours le mutex chaque fois que
tu appelles pthread_cond_wait.
C'est quoi, POSIXThread. Est-ce qu'il s'agit ici d'un wrapper
pour un pthread_cond_t, ou... ?
Et il n'y a pas de groupe Posix francophone où les gens sont
aussi sympas et compétents ?
Appeler pthread_cond_wait sans avoir contrôle du mutex donne un
comportement indéfini, selon la norme Posix.
Deux choses à vérifier. D'abord, que le pthread_cond_t est bien
initialisé AVANT le premier appel à pthread_cond_wait, et
deuxièmement, que tu detiens toujours le mutex chaque fois que
tu appelles pthread_cond_wait.
C'est quoi, POSIXThread. Est-ce qu'il s'agit ici d'un wrapper
pour un pthread_cond_t, ou... ?
Et il n'y a pas de groupe Posix francophone où les gens sont
aussi sympas et compétents ?
Appeler pthread_cond_wait sans avoir contrôle du mutex donne un
comportement indéfini, selon la norme Posix.
dans l'article
, kanze à
a écrit le 21/03/06 10:34 :Deux choses à vérifier. D'abord, que le pthread_cond_t est
bien initialisé AVANT le premier appel à pthread_cond_wait,
et deuxièmement, que tu detiens toujours le mutex chaque
fois que tu appelles pthread_cond_wait.
Effectivement après plusieurs lectures j'ai entouré :
condition.lock_mutex();
condition.signal();
condition.unlock_mutex();
Et
condition.lock_mutex();
condition.wait();
condition.unlock_mutex();
C'est quoi, POSIXThread. Est-ce qu'il s'agit ici d'un
wrapper pour un pthread_cond_t, ou... ?
Oui, j'utilise ce truc très simple trouvé sur le net :
http://www.partow.net/programming/posixsynchwrapper/index.html
Plutôt que Boost ou Ace qui m'effraies encore.
Et il n'y a pas de groupe Posix francophone où les gens sont
aussi sympas et compétents ?
Oui... Mais ou ????
Appeler pthread_cond_wait sans avoir contrôle du mutex donne
un comportement indéfini, selon la norme Posix.
C'est énervent un comportement indéfini qui fonctionne bien :-)
dans l'article
1142933640.186633.289470@u72g2000cwu.googlegroups.com, kanze à
kanze@gabi-soft.fr a écrit le 21/03/06 10:34 :
Deux choses à vérifier. D'abord, que le pthread_cond_t est
bien initialisé AVANT le premier appel à pthread_cond_wait,
et deuxièmement, que tu detiens toujours le mutex chaque
fois que tu appelles pthread_cond_wait.
Effectivement après plusieurs lectures j'ai entouré :
condition.lock_mutex();
condition.signal();
condition.unlock_mutex();
Et
condition.lock_mutex();
condition.wait();
condition.unlock_mutex();
C'est quoi, POSIXThread. Est-ce qu'il s'agit ici d'un
wrapper pour un pthread_cond_t, ou... ?
Oui, j'utilise ce truc très simple trouvé sur le net :
http://www.partow.net/programming/posixsynchwrapper/index.html
Plutôt que Boost ou Ace qui m'effraies encore.
Et il n'y a pas de groupe Posix francophone où les gens sont
aussi sympas et compétents ?
Oui... Mais ou ????
Appeler pthread_cond_wait sans avoir contrôle du mutex donne
un comportement indéfini, selon la norme Posix.
C'est énervent un comportement indéfini qui fonctionne bien :-)
dans l'article
, kanze à
a écrit le 21/03/06 10:34 :Deux choses à vérifier. D'abord, que le pthread_cond_t est
bien initialisé AVANT le premier appel à pthread_cond_wait,
et deuxièmement, que tu detiens toujours le mutex chaque
fois que tu appelles pthread_cond_wait.
Effectivement après plusieurs lectures j'ai entouré :
condition.lock_mutex();
condition.signal();
condition.unlock_mutex();
Et
condition.lock_mutex();
condition.wait();
condition.unlock_mutex();
C'est quoi, POSIXThread. Est-ce qu'il s'agit ici d'un
wrapper pour un pthread_cond_t, ou... ?
Oui, j'utilise ce truc très simple trouvé sur le net :
http://www.partow.net/programming/posixsynchwrapper/index.html
Plutôt que Boost ou Ace qui m'effraies encore.
Et il n'y a pas de groupe Posix francophone où les gens sont
aussi sympas et compétents ?
Oui... Mais ou ????
Appeler pthread_cond_wait sans avoir contrôle du mutex donne
un comportement indéfini, selon la norme Posix.
C'est énervent un comportement indéfini qui fonctionne bien :-)
Attention ! Normalement, il faut tester la variable de contrôle
et entrer dans wait sans lacher le mutex entre temps. Sinon, tu
as une possibilité d'une race (« race condition », je ne suis
pas sûr de la traduction française correcte) :
Thread A Thread B
teste variable,
le trouve fausse...
prend le main, met la
variable à vrai, puis fait
signal()
entre dans le wait...
Pour thread B, thread A a été activé. Thread A, en revanche,
attend toujours l'activation. (Dans beaucoup de cas, thread B
finira par attendre une réponse de thread A, pour savoir si la
requête s'est bien passée. Après le scénario ci-dessus, il
risque d'attendre longtemps.) Il ne faut pas que le thread A
puisse être interrompu entre le test de la variable et l'entrée
dans le wait.
Je t'avais indiqué l'idiome consacré. Il ne faut s'en écarter
que dans des cas très spéciax, et s'en écarter comporte de
grandes risques.
Attention ! Normalement, il faut tester la variable de contrôle
et entrer dans wait sans lacher le mutex entre temps. Sinon, tu
as une possibilité d'une race (« race condition », je ne suis
pas sûr de la traduction française correcte) :
Thread A Thread B
teste variable,
le trouve fausse...
prend le main, met la
variable à vrai, puis fait
signal()
entre dans le wait...
Pour thread B, thread A a été activé. Thread A, en revanche,
attend toujours l'activation. (Dans beaucoup de cas, thread B
finira par attendre une réponse de thread A, pour savoir si la
requête s'est bien passée. Après le scénario ci-dessus, il
risque d'attendre longtemps.) Il ne faut pas que le thread A
puisse être interrompu entre le test de la variable et l'entrée
dans le wait.
Je t'avais indiqué l'idiome consacré. Il ne faut s'en écarter
que dans des cas très spéciax, et s'en écarter comporte de
grandes risques.
Attention ! Normalement, il faut tester la variable de contrôle
et entrer dans wait sans lacher le mutex entre temps. Sinon, tu
as une possibilité d'une race (« race condition », je ne suis
pas sûr de la traduction française correcte) :
Thread A Thread B
teste variable,
le trouve fausse...
prend le main, met la
variable à vrai, puis fait
signal()
entre dans le wait...
Pour thread B, thread A a été activé. Thread A, en revanche,
attend toujours l'activation. (Dans beaucoup de cas, thread B
finira par attendre une réponse de thread A, pour savoir si la
requête s'est bien passée. Après le scénario ci-dessus, il
risque d'attendre longtemps.) Il ne faut pas que le thread A
puisse être interrompu entre le test de la variable et l'entrée
dans le wait.
Je t'avais indiqué l'idiome consacré. Il ne faut s'en écarter
que dans des cas très spéciax, et s'en écarter comporte de
grandes risques.
C'est cela?
C'est cela?
C'est cela?
J'espere que je ne vous "gonfle" pas trop avec mon probleme.
J'espere que je ne vous "gonfle" pas trop avec mon probleme.
J'espere que je ne vous "gonfle" pas trop avec mon probleme.
mutex_priority : pour la synchronisation de la variable priority
mutex pour la synchronisation des methodes start() et wait()
void RXEngine::set_priority() {
mutex_priority.lock();
if(!priority) {
priority = true;
condition.lock_mutex();
condition.signal();
condition.unlock_mutex
}
mutex_priority.unlock();
}
void RXEngine::wait() {
mutex.lock();
mutex_priority.lock();
priority = false;
mutex_priority.unlock();
mutex.unlock();
}
Et dans mon traitement :
mutex_priority.lock();
If(! priority) {
timer.wait();
condition.lock_mutex();
condition.wait();
condition.unlock_mutex();
timer.restart();
}
mutex_priority.unlock();
C'est cela?
mutex_priority : pour la synchronisation de la variable priority
mutex pour la synchronisation des methodes start() et wait()
void RXEngine::set_priority() {
mutex_priority.lock();
if(!priority) {
priority = true;
condition.lock_mutex();
condition.signal();
condition.unlock_mutex
}
mutex_priority.unlock();
}
void RXEngine::wait() {
mutex.lock();
mutex_priority.lock();
priority = false;
mutex_priority.unlock();
mutex.unlock();
}
Et dans mon traitement :
mutex_priority.lock();
If(! priority) {
timer.wait();
condition.lock_mutex();
condition.wait();
condition.unlock_mutex();
timer.restart();
}
mutex_priority.unlock();
C'est cela?
mutex_priority : pour la synchronisation de la variable priority
mutex pour la synchronisation des methodes start() et wait()
void RXEngine::set_priority() {
mutex_priority.lock();
if(!priority) {
priority = true;
condition.lock_mutex();
condition.signal();
condition.unlock_mutex
}
mutex_priority.unlock();
}
void RXEngine::wait() {
mutex.lock();
mutex_priority.lock();
priority = false;
mutex_priority.unlock();
mutex.unlock();
}
Et dans mon traitement :
mutex_priority.lock();
If(! priority) {
timer.wait();
condition.lock_mutex();
condition.wait();
condition.unlock_mutex();
timer.restart();
}
mutex_priority.unlock();
C'est cela?
}
void RXEngine::wait() {
mutex.lock();
mutex_priority.lock();
priority = false;
mutex_priority.unlock();
mutex.unlock();
}
Et ici, je ne vois pas du tout où tu attends la condition.
Non. Tu t'obstines à vouloir séparer deux opérations qui ne
peuvent pas être séparées. La gestion de la condition et les
accès à la variable associée sont indissociable. La variable, la
condition et le mutex forment un tout. En pseudo-code :
Note bien que la variable fait aussi partie du triplet. On ne
l'utilise que pour ça, et on ne s'amuse pas à la modifier
autrement.
En plus, je ne comprends pas la rôle du timer. Si le but est de
mettre un time-out, il existe un appel pthread_cond_timedwait
qui fait l'affaire.
Aussi : si les classes de wrapper dont tu te sers n'offre pas la
possibilité de faire un scoped_lock, ou quelque chose du genre,
jette-les. Sinon, le moindre truc qui foire, et tu risques de
bloquer toute l'application.
}
void RXEngine::wait() {
mutex.lock();
mutex_priority.lock();
priority = false;
mutex_priority.unlock();
mutex.unlock();
}
Et ici, je ne vois pas du tout où tu attends la condition.
Non. Tu t'obstines à vouloir séparer deux opérations qui ne
peuvent pas être séparées. La gestion de la condition et les
accès à la variable associée sont indissociable. La variable, la
condition et le mutex forment un tout. En pseudo-code :
Note bien que la variable fait aussi partie du triplet. On ne
l'utilise que pour ça, et on ne s'amuse pas à la modifier
autrement.
En plus, je ne comprends pas la rôle du timer. Si le but est de
mettre un time-out, il existe un appel pthread_cond_timedwait
qui fait l'affaire.
Aussi : si les classes de wrapper dont tu te sers n'offre pas la
possibilité de faire un scoped_lock, ou quelque chose du genre,
jette-les. Sinon, le moindre truc qui foire, et tu risques de
bloquer toute l'application.
}
void RXEngine::wait() {
mutex.lock();
mutex_priority.lock();
priority = false;
mutex_priority.unlock();
mutex.unlock();
}
Et ici, je ne vois pas du tout où tu attends la condition.
Non. Tu t'obstines à vouloir séparer deux opérations qui ne
peuvent pas être séparées. La gestion de la condition et les
accès à la variable associée sont indissociable. La variable, la
condition et le mutex forment un tout. En pseudo-code :
Note bien que la variable fait aussi partie du triplet. On ne
l'utilise que pour ça, et on ne s'amuse pas à la modifier
autrement.
En plus, je ne comprends pas la rôle du timer. Si le but est de
mettre un time-out, il existe un appel pthread_cond_timedwait
qui fait l'affaire.
Aussi : si les classes de wrapper dont tu te sers n'offre pas la
possibilité de faire un scoped_lock, ou quelque chose du genre,
jette-les. Sinon, le moindre truc qui foire, et tu risques de
bloquer toute l'application.
Plutôt que Boost ou Ace qui m'effraies encore.
Ace m'effraie aussi. D'autant plus qu'il n'a pas marché pour ce
qu'il m'a fallu (un socket UDP), et que j'ai trouvé des erreurs
dans la gestion de thread par ailleurs.
Plutôt que Boost ou Ace qui m'effraies encore.
Ace m'effraie aussi. D'autant plus qu'il n'a pas marché pour ce
qu'il m'a fallu (un socket UDP), et que j'ai trouvé des erreurs
dans la gestion de thread par ailleurs.
Plutôt que Boost ou Ace qui m'effraies encore.
Ace m'effraie aussi. D'autant plus qu'il n'a pas marché pour ce
qu'il m'a fallu (un socket UDP), et que j'ai trouvé des erreurs
dans la gestion de thread par ailleurs.