template<class T, class Container = std::list<T>>
class Cgu::AsyncQueue< T, Container >
A thread-safe asynchronous queue.
- See also:
- AsyncQueueDispatch
AsyncQueue is a class which provides some of the functionality of a std::queue object (but note that the AsyncQueue::pop(value_type& obj) method provides the pop()ed element by reference - see the comments on that method for the reason), except that it has mutex locking of the data container so as to permit push()ing and pop()ing from different threads. It is therefore useful for passing data between threads, perhaps in response to a signal being emitted from a Notifier object. Passing the data by means of a SharedLockPtr object, or an IntrusivePtr object referencing data derived from IntrusiveLockCounter, would be ideal.
By default the queue uses a std::list object as its container because in the kind of use mentioned above it is unlikely to hold many objects but it can be changed to, say, a std::deque object by specifying it as the second template parameter.
If the library is installed using the --with-glib-memory-slices-compat or --with-glib-memory-slices-no-compat configuration options, any AsyncQueue objects constructed on free store will be constructed in glib memory slices. This does not affect the queue container itself: to change the allocator of the C++ container, a custom allocator type can be provided when the AsyncQueue object is instantiated offering the standard allocator interface.
template<class T , class Container = std::list<T>>
template<class... Args>
Pushes an item onto the queue by constructing it in place: that is, by passing to this method the item's constructor's arguments, rather than the item itself. This method has strong exception safety if the container is a std::list or std::deque container (the default is std::list). (Technically, for a std::deque container, emplace() only offers the same exception guarantees as does push(), namely only the basic guarantee where a copy or move of the queue item throws during the call, but the purpose of emplace is to construct in place and any reasonable implementation will not copy or move the queue item.) It is thread safe.
- Parameters:
-
args | The constructor arguments for the item to be pushed onto the queue. |
- Exceptions:
-
std::bad_alloc | The method might throw std::bad_alloc if memory is exhausted and the system throws in that case. It might also throw if the item's constructor (including any of its constructor arguments) might throw when constructing the item. |
- Note:
- The constructor of the item pushed onto the queue must not access any of the methods of the same queue object, or a deadlock might occur.
Since 2.0.0-rc5
template<class T , class Container = std::list<T>>
Pushes an item onto the queue. This method has strong exception safety if the container is a std::list or std::deque container (the default is std::list), except that if std::deque is used as the container and the copy constructor, move constructor, assignment operator or move assignment operator of the queue item throws, it only gives the basic exception guarantee (and the basic guarantee is not given by std::deque if the queue item's move constructor throws and it uses a non-default allocator which does not provide for it to be CopyInsertable). It is thread safe.
- Parameters:
-
obj | The item to be pushed onto the queue. |
- Exceptions:
-
std::bad_alloc | The method might throw std::bad_alloc if memory is exhausted and the system throws in that case. It might also throw if the copy constructor, move constructor, assignment operator or move assignment operator of the queue item might throw. |
template<class T , class Container = std::list<T>>
Pushes an item onto the queue. This method has strong exception safety if the container is a std::list or std::deque container (the default is std::list), except that if std::deque is used as the container and the copy constructor, move constructor, assignment operator or move assignment operator of the queue item throws, it only gives the basic exception guarantee (and the basic guarantee is not given by std::deque if the queue item's move constructor throws and it uses a non-default allocator which does not provide for it to be CopyInsertable). It is thread safe.
- Parameters:
-
obj | The item to be pushed onto the queue. |
- Exceptions:
-
std::bad_alloc | The method might throw std::bad_alloc if memory is exhausted and the system throws in that case. It might also throw if the copy constructor, move constructor, assignment operator or move assignment operator of the queue item might throw. |
Since 2.0.0-rc5