Existe-t-il un moyen simple d'écrire un thread en C ou C++
qui attende des éléments sur une FIFO (une queue STL par exemple)
*sans faire d'attente active* (même avec une temporisation) ?
Concrètement, je ne souhaite pas de :
while (true) {
if (!queue->empty()) {
element = queue->front();
...
queue->pop();
}
/* éventuellement une temporisation ici */
}
Existe-t-il un moyen simple d'écrire un thread en C ou C++ qui attende des éléments sur une FIFO (une queue STL par exemple) *sans faire d'attente active* (même avec une temporisation) ?
en C standard, cela n'existe pas, en POSIX, tu as les sémaphores.
<POSIX> #include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned value); int sem_wait(sem_t *sem); int sem_post(sem_t *sem); int sem_destroy(sem_t *sem); </POSIX>
Il s'agit d'un compteur de ressources disponibles bloquant lorsqu'il arrive sur zéro. Tu peux choisir la valeur initiale du compteur.
Tu dois avoir le même genre de choses sous windows.
-- DINH V. Hoa,
"il faut arrêter de fumer et de boire de la bière. Avec les économies réalisées, on s'achète un PC" -- ed
Existe-t-il un moyen simple d'écrire un thread en C ou C++
qui attende des éléments sur une FIFO (une queue STL par exemple)
*sans faire d'attente active* (même avec une temporisation) ?
en C standard, cela n'existe pas, en POSIX, tu as les sémaphores.
<POSIX>
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned value);
int sem_wait(sem_t *sem);
int sem_post(sem_t *sem);
int sem_destroy(sem_t *sem);
</POSIX>
Il s'agit d'un compteur de ressources disponibles bloquant lorsqu'il
arrive sur zéro. Tu peux choisir la valeur initiale du compteur.
Tu dois avoir le même genre de choses sous windows.
--
DINH V. Hoa,
"il faut arrêter de fumer et de boire de la bière. Avec les économies
réalisées, on s'achète un PC" -- ed
Existe-t-il un moyen simple d'écrire un thread en C ou C++ qui attende des éléments sur une FIFO (une queue STL par exemple) *sans faire d'attente active* (même avec une temporisation) ?
en C standard, cela n'existe pas, en POSIX, tu as les sémaphores.
<POSIX> #include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned value); int sem_wait(sem_t *sem); int sem_post(sem_t *sem); int sem_destroy(sem_t *sem); </POSIX>
Il s'agit d'un compteur de ressources disponibles bloquant lorsqu'il arrive sur zéro. Tu peux choisir la valeur initiale du compteur.
Tu dois avoir le même genre de choses sous windows.
-- DINH V. Hoa,
"il faut arrêter de fumer et de boire de la bière. Avec les économies réalisées, on s'achète un PC" -- ed
Christophe Lephay
Nicolas HUYNH wrote:
Existe-t-il un moyen simple d'écrire un thread en C ou C++ qui attende des éléments sur une FIFO (une queue STL par exemple) *sans faire d'attente active* (même avec une temporisation) ?
Concrètement, je ne souhaite pas de :
while (true) { if (!queue->empty()) { element = queue->front(); ... queue->pop(); } /* éventuellement une temporisation ici */ }
mais plutôt un appel bloquant "à la langage Ada"
Merci pour toute réponse !
Il n'y a pas de méthode portable. Tu devrais reposer la question dans un groupe dédié à la programmation dans ton environnement. La solution reposera vraisemblablement sur un sémaphore, pour peu que ceux-ci y soient disponibles (ou éventuellement sur des signaux ou messages, même si celà ne sera plus vraiment "un appel bloquant à la ADA").
Chris
Nicolas HUYNH wrote:
Existe-t-il un moyen simple d'écrire un thread en C ou C++
qui attende des éléments sur une FIFO (une queue STL par exemple)
*sans faire d'attente active* (même avec une temporisation) ?
Concrètement, je ne souhaite pas de :
while (true) {
if (!queue->empty()) {
element = queue->front();
...
queue->pop();
}
/* éventuellement une temporisation ici */
}
mais plutôt un appel bloquant "à la langage Ada"
Merci pour toute réponse !
Il n'y a pas de méthode portable. Tu devrais reposer la question dans un
groupe dédié à la programmation dans ton environnement. La solution reposera
vraisemblablement sur un sémaphore, pour peu que ceux-ci y soient
disponibles (ou éventuellement sur des signaux ou messages, même si celà ne
sera plus vraiment "un appel bloquant à la ADA").
Existe-t-il un moyen simple d'écrire un thread en C ou C++ qui attende des éléments sur une FIFO (une queue STL par exemple) *sans faire d'attente active* (même avec une temporisation) ?
Concrètement, je ne souhaite pas de :
while (true) { if (!queue->empty()) { element = queue->front(); ... queue->pop(); } /* éventuellement une temporisation ici */ }
mais plutôt un appel bloquant "à la langage Ada"
Merci pour toute réponse !
Il n'y a pas de méthode portable. Tu devrais reposer la question dans un groupe dédié à la programmation dans ton environnement. La solution reposera vraisemblablement sur un sémaphore, pour peu que ceux-ci y soient disponibles (ou éventuellement sur des signaux ou messages, même si celà ne sera plus vraiment "un appel bloquant à la ADA").
Chris
Christophe de VIENNE
Nicolas HUYNH wrote:
Bonjour à tous
Existe-t-il un moyen simple d'écrire un thread en C ou C++ qui attende des éléments sur une FIFO (une queue STL par exemple) *sans faire d'attente active* (même avec une temporisation) ?
Si ça t'interesse j'ai implémenté ça en utilisant boost/thread et les queue de la stl.
C'est pas parfait (ça hérite d'un conteneur STL, ce qui n'est par forcément le mieux), mais ça fonctionne plutôt bien (tout commentaire sur le style est le bienvenue d'ailleurs).
Existe-t-il un moyen simple d'écrire un thread en C ou C++
qui attende des éléments sur une FIFO (une queue STL par exemple)
*sans faire d'attente active* (même avec une temporisation) ?
Si ça t'interesse j'ai implémenté ça en utilisant boost/thread et les
queue de la stl.
C'est pas parfait (ça hérite d'un conteneur STL, ce qui n'est par
forcément le mieux), mais ça fonctionne plutôt bien (tout commentaire
sur le style est le bienvenue d'ailleurs).
Existe-t-il un moyen simple d'écrire un thread en C ou C++ qui attende des éléments sur une FIFO (une queue STL par exemple) *sans faire d'attente active* (même avec une temporisation) ?
Si ça t'interesse j'ai implémenté ça en utilisant boost/thread et les queue de la stl.
C'est pas parfait (ça hérite d'un conteneur STL, ce qui n'est par forcément le mieux), mais ça fonctionne plutôt bien (tout commentaire sur le style est le bienvenue d'ailleurs).
Mes excuses aux lecteurs de fclc, je n'avais pas vue le cross-post...
Pascal
Nicolas HUYNH wrote:
Bonjour à tous
Existe-t-il un moyen simple d'écrire un thread en C ou C++ qui attende des éléments sur une FIFO (une queue STL par exemple) *sans faire d'attente active* (même avec une temporisation) ?
Concrètement, je ne souhaite pas de :
while (true) { if (!queue->empty()) { element = queue->front(); ... queue->pop(); } /* éventuellement une temporisation ici */ }
mais plutôt un appel bloquant "à la langage Ada"
Merci pour toute réponse !
N.
Tu peux utiliser la commande seletct.
-- Pascal
Nicolas HUYNH wrote:
Bonjour à tous
Existe-t-il un moyen simple d'écrire un thread en C ou C++
qui attende des éléments sur une FIFO (une queue STL par exemple)
*sans faire d'attente active* (même avec une temporisation) ?
Concrètement, je ne souhaite pas de :
while (true) {
if (!queue->empty()) {
element = queue->front();
...
queue->pop();
}
/* éventuellement une temporisation ici */
}
Existe-t-il un moyen simple d'écrire un thread en C ou C++ qui attende des éléments sur une FIFO (une queue STL par exemple) *sans faire d'attente active* (même avec une temporisation) ?
Concrètement, je ne souhaite pas de :
while (true) { if (!queue->empty()) { element = queue->front(); ... queue->pop(); } /* éventuellement une temporisation ici */ }
mais plutôt un appel bloquant "à la langage Ada"
Merci pour toute réponse !
N.
Tu peux utiliser la commande seletct.
-- Pascal
DINH Viêt Hoà
Nicolas HUYNH wrote:
Bonjour à tous
Existe-t-il un moyen simple d'écrire un thread en C ou C++ qui attende des éléments sur une FIFO (une queue STL par exemple) *sans faire d'attente active* (même avec une temporisation) ?
Concrètement, je ne souhaite pas de :
while (true) { if (!queue->empty()) { element = queue->front(); ... queue->pop(); } /* éventuellement une temporisation ici */ }
mais plutôt un appel bloquant "à la langage Ada"
Merci pour toute réponse !
Tu peux utiliser la commande seletct.
on doit préciser que cette fonction n'exite qu'en POSIX, Enfin son utilisation n'est pas trop adaptée à la situation.
-- DINH V. Hoa,
"il faut arrêter de fumer et de boire de la bière. Avec les économies réalisées, on s'achète un PC" -- ed
Nicolas HUYNH wrote:
Bonjour à tous
Existe-t-il un moyen simple d'écrire un thread en C ou C++
qui attende des éléments sur une FIFO (une queue STL par exemple)
*sans faire d'attente active* (même avec une temporisation) ?
Concrètement, je ne souhaite pas de :
while (true) {
if (!queue->empty()) {
element = queue->front();
...
queue->pop();
}
/* éventuellement une temporisation ici */
}
mais plutôt un appel bloquant "à la langage Ada"
Merci pour toute réponse !
Tu peux utiliser la commande seletct.
on doit préciser que cette fonction n'exite qu'en POSIX,
Enfin son utilisation n'est pas trop adaptée à la situation.
--
DINH V. Hoa,
"il faut arrêter de fumer et de boire de la bière. Avec les économies
réalisées, on s'achète un PC" -- ed
Existe-t-il un moyen simple d'écrire un thread en C ou C++ qui attende des éléments sur une FIFO (une queue STL par exemple) *sans faire d'attente active* (même avec une temporisation) ?
Concrètement, je ne souhaite pas de :
while (true) { if (!queue->empty()) { element = queue->front(); ... queue->pop(); } /* éventuellement une temporisation ici */ }
mais plutôt un appel bloquant "à la langage Ada"
Merci pour toute réponse !
Tu peux utiliser la commande seletct.
on doit préciser que cette fonction n'exite qu'en POSIX, Enfin son utilisation n'est pas trop adaptée à la situation.
-- DINH V. Hoa,
"il faut arrêter de fumer et de boire de la bière. Avec les économies réalisées, on s'achète un PC" -- ed
Emmanuel Delahaye
In 'fr.comp.lang.c', Nicolas HUYNH wrote:
Existe-t-il un moyen simple d'écrire un thread en C ou C++
Il n'y a pas de thread en C. C'est une ressource système. Merci de reposter sur un forum dédié à ton système.
-- -ed- [remove YOURBRA before answering me] The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/
In 'fr.comp.lang.c', Nicolas HUYNH <huynh@ath.cena.fr> wrote:
Existe-t-il un moyen simple d'écrire un thread en C ou C++
Il n'y a pas de thread en C. C'est une ressource système. Merci de reposter
sur un forum dédié à ton système.
--
-ed- emdelYOURBRA@noos.fr [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/
"il faut arrêter de fumer et de boire de la bière. Avec les économies réalisées, on s'achète un PC" -- ed
Non, il faut continuer, sinon on va tous devenir fou a force de vivre dans un monde numerique et beaucoup trop logique.
MB
Bertrand Motuelle
"Christophe de VIENNE" schrieb im Newsbeitrag news:newscache$qvyxnh$n2c$
Nicolas HUYNH wrote:
Bonjour à tous
Existe-t-il un moyen simple d'écrire un thread en C ou C++ qui attende des éléments sur une FIFO (une queue STL par exemple) *sans faire d'attente active* (même avec une temporisation) ?
Si ça t'interesse j'ai implémenté ça en utilisant boost/thread et les queue de la stl.
C'est pas parfait (ça hérite d'un conteneur STL, ce qui n'est par forcément le mieux), mais ça fonctionne plutôt bien (tout commentaire sur le style est le bienvenue d'ailleurs).
bool empty(); size_type size(); }; Personellement, j'aurais plutôt tendance à mettre les fonctions publiques
avant la section privée. Je déclarerais empty() et size() const, et my_mutex et my_condition mutable. Et puis, ben je supprimerais l'héritage et déclarerais my_queue ;-)
my_condition.notify_one(); C'est pinailler, mais le mutex peut être relaché avant l'appel notify_one()
(dans le cas général).
}
[snip surcharges de pop()]
Puisque tu demandais des commentaires sur le style: l'idiome avec les variables conditionnelles est plutôt d'utiliser un while sur la condition (les threads bloqués peuvent souffrir de "spurious wakeup"). Je trouves que la solution que tu as retenue (le wait + prédicat, qui cache le while) est beaucoup moins lisible (combinée avec l'héritage privé, il m'a fallu quelque retours arrières + avances rapides avant de voir quelle fonction empty() était réelement appelée).
Enfin, je n'aurais pas essayé de coller les deux wait/timed_wait dans la même fonction pop. Je trouve que garder deux fonctions séparées n'a que des avantages (lisibilité, pas de création de variable inutile dans le cas du wait...)
[snip empty(), size()]
Et sinon, je ne peux qu'être d'accord avec ton implémentation: mis à part 2 ou 3 détails c'est vraiment comme ca que je fais :-) (mais sans boost, un de mes compilos y est allergique).
Bertrand.
"Christophe de VIENNE" <cdevienne@alphacent.com> schrieb im Newsbeitrag
news:newscache$qvyxnh$n2c$1@guronzan.alphacent.com...
Nicolas HUYNH wrote:
Bonjour à tous
Existe-t-il un moyen simple d'écrire un thread en C ou C++
qui attende des éléments sur une FIFO (une queue STL par exemple)
*sans faire d'attente active* (même avec une temporisation) ?
Si ça t'interesse j'ai implémenté ça en utilisant boost/thread et les
queue de la stl.
C'est pas parfait (ça hérite d'un conteneur STL, ce qui n'est par
forcément le mieux), mais ça fonctionne plutôt bien (tout commentaire
sur le style est le bienvenue d'ailleurs).
bool empty();
size_type size();
};
Personellement, j'aurais plutôt tendance à mettre les fonctions publiques
avant la section privée.
Je déclarerais empty() et size() const, et my_mutex et my_condition mutable.
Et puis, ben je supprimerais l'héritage et déclarerais my_queue ;-)
my_condition.notify_one();
C'est pinailler, mais le mutex peut être relaché avant l'appel notify_one()
(dans le cas général).
}
[snip surcharges de pop()]
Puisque tu demandais des commentaires sur le style: l'idiome avec les
variables conditionnelles est plutôt d'utiliser un while sur la condition
(les threads bloqués peuvent souffrir de "spurious wakeup").
Je trouves que la solution que tu as retenue (le wait + prédicat, qui cache
le while) est beaucoup moins lisible (combinée avec l'héritage privé, il m'a
fallu quelque retours arrières + avances rapides avant de voir quelle
fonction empty() était réelement appelée).
Enfin, je n'aurais pas essayé de coller les deux wait/timed_wait dans la
même fonction pop.
Je trouve que garder deux fonctions séparées n'a que des avantages
(lisibilité, pas de création de variable inutile dans le cas du wait...)
[snip empty(), size()]
Et sinon, je ne peux qu'être d'accord avec ton implémentation: mis à part 2
ou 3 détails c'est vraiment comme ca que je fais :-)
(mais sans boost, un de mes compilos y est allergique).
"Christophe de VIENNE" schrieb im Newsbeitrag news:newscache$qvyxnh$n2c$
Nicolas HUYNH wrote:
Bonjour à tous
Existe-t-il un moyen simple d'écrire un thread en C ou C++ qui attende des éléments sur une FIFO (une queue STL par exemple) *sans faire d'attente active* (même avec une temporisation) ?
Si ça t'interesse j'ai implémenté ça en utilisant boost/thread et les queue de la stl.
C'est pas parfait (ça hérite d'un conteneur STL, ce qui n'est par forcément le mieux), mais ça fonctionne plutôt bien (tout commentaire sur le style est le bienvenue d'ailleurs).
bool empty(); size_type size(); }; Personellement, j'aurais plutôt tendance à mettre les fonctions publiques
avant la section privée. Je déclarerais empty() et size() const, et my_mutex et my_condition mutable. Et puis, ben je supprimerais l'héritage et déclarerais my_queue ;-)
my_condition.notify_one(); C'est pinailler, mais le mutex peut être relaché avant l'appel notify_one()
(dans le cas général).
}
[snip surcharges de pop()]
Puisque tu demandais des commentaires sur le style: l'idiome avec les variables conditionnelles est plutôt d'utiliser un while sur la condition (les threads bloqués peuvent souffrir de "spurious wakeup"). Je trouves que la solution que tu as retenue (le wait + prédicat, qui cache le while) est beaucoup moins lisible (combinée avec l'héritage privé, il m'a fallu quelque retours arrières + avances rapides avant de voir quelle fonction empty() était réelement appelée).
Enfin, je n'aurais pas essayé de coller les deux wait/timed_wait dans la même fonction pop. Je trouve que garder deux fonctions séparées n'a que des avantages (lisibilité, pas de création de variable inutile dans le cas du wait...)
[snip empty(), size()]
Et sinon, je ne peux qu'être d'accord avec ton implémentation: mis à part 2 ou 3 détails c'est vraiment comme ca que je fais :-) (mais sans boost, un de mes compilos y est allergique).
Bertrand.
Benoit Rousseau
M. B. wrote:
"DINH Viêt Hoà" a écrit dans le message news:
"il faut arrêter de fumer et de boire de la bière. Avec les économies réalisées, on s'achète un PC" -- ed
Non, il faut continuer, sinon on va tous devenir fou a force de vivre dans un monde numerique et beaucoup trop logique.
Et a 1,50 Euro la bierre en Belgique, il va falloir se priver longtemps pour s'acheter un PC...
-- -------------------------------------------- Benoît Rousseau : roussebe at spray dot se Jouez en programmant : http://realtimebattle.sourceforge.net/
M. B. wrote:
"DINH Viêt Hoà" <dinh.viet.hoa@free.fr> a écrit dans le message news:
etPan.3faa8e44.3fed22f7.26ea@homer...
"il faut arrêter de fumer et de boire de la bière. Avec les économies
réalisées, on s'achète un PC" -- ed
Non, il faut continuer, sinon on va tous devenir fou a force
de vivre dans un monde numerique et beaucoup trop logique.
Et a 1,50 Euro la bierre en Belgique, il va falloir se priver longtemps
pour s'acheter un PC...
--
--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/
"il faut arrêter de fumer et de boire de la bière. Avec les économies réalisées, on s'achète un PC" -- ed
Non, il faut continuer, sinon on va tous devenir fou a force de vivre dans un monde numerique et beaucoup trop logique.
Et a 1,50 Euro la bierre en Belgique, il va falloir se priver longtemps pour s'acheter un PC...
-- -------------------------------------------- Benoît Rousseau : roussebe at spray dot se Jouez en programmant : http://realtimebattle.sourceforge.net/