Ce n'mutex lock échouer avec l'argument invalide veux dire?
Ce code est appelé dans mon processus principal et compile bien, mais lors de l'exécution jette toujours l'erreur ci-dessous.
bounded_buffer<MyData> bb(200);
Producer<bounded_buffer<MyData> > producer(&bb);
boost::thread produce(producer); //throws on this line
Voici l'erreur qui apparaît lors de l'exécution.
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::lock_error> >'
what(): boost: mutex lock failed in pthread_mutex_lock: Invalid argument
Le code de la classe de bounded_buffer' est exactement comme indiqué sur ce coup de pouce exemple de page ... http://www.boost.org/doc/libs/1_55_0/libs/circular_buffer/example/circular_buffer_bound_example.cpp
J'ai trouvé cette page qui semble montrer exactement la même chose, mais j'ai été incapable de comprendre la réponse donnée. Boost scoped_lock a échoué à chaque fois
Mise à jour:
Voici ce que Producteur::operator() n'est actuellement lorsque le foncteur est appelé. Et mes intentions pour ce que je veux ce thread.
void operator() () {
//init();
//read();
//this line just a test
m_container->push_front(value_type());
/*Eventually will do the following:
while (1) {
read_from_usb_device();
//then store data in global buffer (bb)
}*/
}
bb
est détruit alors que le thread est toujours en cours d'exécution.Je ne vois pas le rejoindre sur le fil. Êtes-vous sûr que bb n'est pas hors de portée?
Si je commente la ligne thread, je n'ai pas cette erreur. La surcharge de l'opérateur() actuellement présente des données sur un tampon global (bb), mais finira par exécuter une boucle de lecture des données à partir d'un périphérique.
Vous n'obtenez pas l'erreur car il ne sera pas démarrer le thread à tous. Cela ne signifie pas que l'exception est levée.
Je voulais savoir ce que vous faites après
boost::thread produce(producer);
?OriginalL'auteur Ender | 2015-05-07
Vous devez vous connecter pour publier un commentaire.
La fonction retourne et
bb
est détruit, mais le fil est toujours en cours d'exécution. Et quandm_container
essaie d'utiliser le mutex, il (avec l'ensemble de lam_container
) n'existe plus.Vous avez besoin d'attendre pour le fil à la fin avant de vous pouvez détruire toutes les données qu'il utilise:
Ou vous avez besoin de transmettre la propriété des données au fil, par exemple. à l'aide de
std::shared_ptr
(si vous voulez partager de la mémoire tampon avecConsumer
comme dans l'élan exemple, mais à la différence de l'exemple à ne pas rejoindre les threads):OriginalL'auteur StenSoft