impulsar el error del compilador de subprocesos con GCC
-
05-07-2019 - |
Pregunta
en linux, gcc 4.3, compilando una clase con boost :: thread implementación y mutexes / condición variables me sale el siguiente error extraño, aparentemente debido a conflictos de tipo con la biblioteca de hilos posix:
*Compiling: filter.cpp
/usr/include/boost/thread/condition.hpp: In member function »void boost::condition::wait(L&) [with L = boost::mutex]«:
/host/.../filter.cpp:68: instantiated from here
/usr/include/boost/thread/condition.hpp:90: Error: no match für »operator!« in »!lock«*
*/usr/include/boost/thread/condition.hpp:90: Notice: candidates are: operator!(bool) <built in>*
*/usr/include/boost/thread/mutex.hpp:66: Error: »pthread_mutex_t boost::mutex::m_mutex« is private
/usr/include/boost/thread/condition.hpp:93: Error: in this context*
El código es:
void CFilter::process( CData **s )
{
boost::mutex::scoped_lock bufferLock(m_mutex);
while (!m_bStop)
m_change.wait(bufferLock); //<- line 68
// ... further processing
}
con la declaración de clase
#include <boost/shared_ptr.hpp>
#include <boost/bind.hpp>
#include <boost/thread/condition.hpp>
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
class CFilter
{
// ...
boost::shared_ptr<boost::thread> m_thread;
boost::mutex m_mutex;
boost::condition m_change;
// ...
process( CData **s );
}
El error del operador se produce en condición de impulso.hpp, en
if (!lock)
throw lock_error();
Estoy usando Boost 1.38.0, en Windows no encuentro ningún problema. ¡Se agradece cualquier ayuda!
Solución
Debe esperar el bufferLock
, no m_mutex
:
while (!m_bStop)
m_change.wait(bufferLock);
Condición < > :: wait () toma un ScopedLock
como parámetro, no un Mutex
.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow