Quelle est la manière standard d'obtenir un code de sortie à partir d'un boost :: thread?
The docs ne semblent pas toucher à ce sujet du tout.boost :: code de sortie de thread?
Répondre
Je ne sais pas si le code de sortie de thread est disponible en tant que système d'exploitation spécifique. Vous pouvez simuler le passage d'un code de sortie ou code de résultat en faisant quelque chose comme ceci:
struct callable {
int result;
void operator()()
{
result = 42;
}
};
void process_on_thread() {
callable x;
boost::thread processor(x);
processor.join();
int result = x.result;
}
Posix ne supporte pas les codes de retour de fils. Je vous recommande d'utiliser un avenir: C++11 provides futures in the standard library, ou si vous êtes sur une ancienne version de C++, le Boost.Thread library a eu une excellente mise en œuvre des contrats à terme since version 1.41. Cela vous donne une syntaxe commune pour la communication à la fois bloquante et non bloquante, vous permet de retourner n'importe quel type d'objet, et comme le glaçage sur le gâteau vous permet de propager des exceptions à partir de threads.
+1 pour la mention des contrats à terme –
Depuis Boost.Thread copie le foncteur que vous lui transmettez la solution de David ne fonctionnera pas dans un exemple réel. Vous avez essentiellement deux options:
- Affectez un tableau de codes de sortie et transmettez une référence à un code de sortie unique dans le constructeur de chaque foncteur. Assez simple à mettre en œuvre.
- Si vous ne créez qu'un seul thread à partir d'un foncteur particulier, alors le foncteur peut contenir un pointeur intelligent partagé vers un code existant alloué dynamiquement qui peut ensuite être lu par l'objet fonctor original.
Voici des exemples de chaque méthode:
Méthode 1:
#include <boost/thread/thread.hpp>
#include <boost/thread/xtime.hpp>
#include <boost/shared_ptr.hpp>
#include <iostream>
struct thread_alarm
{
thread_alarm(int secs, int &ec) : m_secs(secs), exit_code(ec) { }
void operator()()
{
boost::xtime xt;
boost::xtime_get(&xt, boost::TIME_UTC);
xt.sec += m_secs;
boost::thread::sleep(xt);
std::cout << "alarm sounded..." << std::endl;
exit_code = 0xDEADBEEF;
}
int m_secs;
int &exit_code;
};
typedef boost::shared_ptr<boost::thread> BoostThreadPtr;
int main(int argc, char* argv[])
{
int secs = 1;
int exit_codes[10];
BoostThreadPtr threads[10];
for (int i = 0; i<10; ++i) {
std::cout << "setting alarm for 1 seconds..." << std::endl;
thread_alarm alarm(secs, exit_codes[i]);
threads[i] = BoostThreadPtr(new boost::thread(alarm));
}
for (int i = 0; i<10; ++i) {
threads[i]->join();
std::cout << "exit code == 0x" << std::hex << exit_codes[i] << std::endl;
}
}
Méthode 2:
#include <boost/thread/thread.hpp>
#include <boost/thread/xtime.hpp>
#include <boost/shared_ptr.hpp>
#include <iostream>
struct thread_alarm
{
thread_alarm(int secs) : m_secs(secs) { exit_code = IntPtr(new int(0)); }
void operator()()
{
boost::xtime xt;
boost::xtime_get(&xt, boost::TIME_UTC);
xt.sec += m_secs;
boost::thread::sleep(xt);
std::cout << "alarm sounded..." << std::endl;
*exit_code = 0xDEADBEEF;
}
int m_secs;
typedef boost::shared_ptr<int> IntPtr;
IntPtr exit_code;
};
int main(int argc, char* argv[])
{
int secs = 5;
std::cout << "setting alarm for 5 seconds..." << std::endl;
thread_alarm alarm(secs);
boost::thread thrd(alarm);
thrd.join();
std::cout << "exit code == 0x" << std::hex << *(alarm.exit_code) << std::endl;
}
- 1. Question de stockage spécifique à Boost Thread (boost/thread/tss.hpp)
- 2. Crash avec boost :: thread
- 3. Boost Thread Annulation
- 4. Récupère le code de sortie Thread après avoir exécuté ShellExecuteEx
- 5. Utilisation d'exceptions dans un boost :: thread thread
- 6. Synchronisation de thread avec boost :: condition_variable
- 7. Compilation boost :: thread avec Eclipse
- 8. Que fait boost :: thread sleep()?
- 9. boost :: fonctions thread et template
- 10. Constructeur de copie non appelé lors de l'utilisation de boost :: bind, boost :: shared_ptr et boost :: thread ensemble
- 11. boost: thread se bloque compilateur C++ microsoft
- 12. Boost Synchronisation de fil
- 13. accéder à la variable membre de l'objet thread boost
- 14. Blocs de code, MinGW, Boost et problèmes de liaison statique
- 15. Message de sortie de thread dans la console .Net MVC
- 16. Boost erreur de compilation
- 17. code de sortie AS IS
- 18. Boost: Fonction Iterator de sortie, réinventer la roue
- 19. Résultats Gdiplusshutdown dans le code de sortie 1
- 20. Code de sortie de l'application Windows Forms
- 21. type de code de sortie du compilateur
- 22. Comment puis-je accéder à mon instance de classe à partir d'un thread boost?
- 23. L'application tombe en panne sur la sortie de thread - C++
- 24. Code de retour/code de sortie pour l'API DataPump d'Oracle
- 25. C++: problème de gestion des exceptions de thread croisé avec boost :: exception
- 26. Réentrance de boost RNG
- 27. Performance de boost :: signals2
- 28. Boost équivalent de ManualResetEvent?
- 29. erreur de fil Boost: Référence
- 30. Impossible de compiler le code à l'aide de Boost graphviz.hpp
Pour que le travail, vous devez passer x dans un wrapper de référence, puisque le constructeur de boost :: thread copie l'argument. –