Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Is this a pseudo code or not?

27 views
Skip to first unread message

fl

unread,
Jan 16, 2017, 1:14:00 PM1/16/17
to
Hi,

I rarely use C++ template. Recently I find this code snippet interesting at
this link:






http://stackoverflow.com/questions/26489876/what-is-the-best-practice-for-passing-data-between-threads-queues-messages-or?noredirect=1&lq=1



When I paste it into a C++ project, it gives error:

Description Resource Path Location Type
‘queue’ in namespace ‘std’ does not name a template type mthread_prj1_sensor.cpp /mthread_prj1_sensor/src line 24 C/C++ Problem


Could you tell me how to make this code snippet compilable?


Thanks,





.....................
/*
Thread_safe queue with conditional variable
*/

template<typename dataType>
class CConcurrentQueue
{
private:
/// Queue
std::queue<dataType> m_queue;
/// Mutex to controll multiple access
std::mutex m_mutex;
/// Conditional variable used to fire event
std::condition_variable m_cv;
/// Atomic variable used to terminate immediately wpop and wtpop functions
std::atomic<bool> m_forceExit = false;

public:
/// <summary> Add a new element in the queue. </summary>
/// <param name="data"> New element. </param>
void push ( dataType const& data )
{
m_forceExit.store ( false );
std::unique_lock<std::mutex> lk ( m_mutex );
m_queue.push ( data );
lk.unlock ();
m_cv.notify_one ();
}
/// <summary> Check queue empty. </summary>
/// <returns> True if the queue is empty. </returns>
bool isEmpty () const
{
std::unique_lock<std::mutex> lk ( m_mutex );
return m_queue.empty ();
}
/// <summary> Pop element from queue. </summary>
/// <param name="popped_value"> [in,out] Element. </param>
/// <returns> false if the queue is empty. </returns>
bool pop ( dataType& popped_value )
{
std::unique_lock<std::mutex> lk ( m_mutex );
if ( m_queue.empty () )
{
return false;
}
else
{
popped_value = m_queue.front ();
m_queue.pop ();
return true;
}
}
/// <summary> Wait and pop an element in the queue. </summary>
/// <param name="popped_value"> [in,out] Element. </param>
/// <returns> False for forced exit. </returns>
bool wpop ( dataType& popped_value )
{
std::unique_lock<std::mutex> lk ( m_mutex );
m_cv.wait ( lk, [&]()->bool{ return !m_queue.empty () || m_forceExit.load(); } );
if ( m_forceExit.load() ) return false;
popped_value = m_queue.front ();
m_queue.pop ();
return true;
}
/// <summary> Timed wait and pop an element in the queue. </summary>
/// <param name="popped_value"> [in,out] Element. </param>
/// <param name="milliseconds"> [in] Wait time. </param>
/// <returns> False for timeout or forced exit. </returns>
bool wtpop ( dataType& popped_value , long milliseconds = 1000)
{
std::unique_lock<std::mutex> lk ( m_mutex );
m_cv.wait_for ( lk, std::chrono::milliseconds ( milliseconds ), [&]()->bool{ return !m_queue.empty () || m_forceExit.load(); } );
if ( m_forceExit.load() ) return false;
if ( m_queue.empty () ) return false;
popped_value = m_queue.front ();
m_queue.pop ();
return true;
}
/// <summary> Queue size. </summary>
int size ()
{
std::unique_lock<std::mutex> lk ( m_mutex );
return static_cast< int >( m_queue.size () );
}
/// <summary> Free the queue and force stop. </summary>
void clear ()
{
m_forceExit.store( true );
std::unique_lock<std::mutex> lk ( m_mutex );
while ( !m_queue.empty () )
{
delete m_queue.front ();
m_queue.pop ();
}
}
/// <summary> Check queue in forced exit state. </summary>
bool isExit () const
{
return m_forceExit.load();
}

};

Scott Lurndal

unread,
Jan 16, 2017, 1:19:37 PM1/16/17
to
fl <rxj...@gmail.com> writes:
>Hi,


>When I paste it into a C++ project, it gives error:
>
>Description Resource Path Location Type
>=E2=80=98queue=E2=80=99 in namespace =E2=80=98std=E2=80=99 does not name a =
>template type mthread_prj1_sensor.cpp /mthread_prj1_sensor/src line 24 C/C+=
>+ Problem
>

#include <queue>
0 new messages