- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个生产者-消费者安排来处理来自网络的事件。 Dispatcher
通过工作线程拥有的互斥锁保护队列为多个 EventHandler
线程提供工作。放入队列的事件对象使用boost::intrusive_ptr
class Event { ... }
typedef boost::intrusive_ptr<Event> EventPtr;
队列是一个模板,定义为:
template<typename Data>
class ConcurrentQueue : boost::noncopyable
{
protected:
std::queue<Data> _queue;
boost::mutex _dataMutex;
boost::condition_variable _dataAvailable;
...
public:
...
void push(Data const& data)
{
boost::mutex::scoped_lock lock(_dataMutex);
_queue.push(data);
lock.unlock();
_dataAvailable.notify_one();
}
...
};
...
typedef ConcurrentQueue<EventPtr> EventQueue;
EventHandler
等待事件放入其队列,并在可用时使用方法 waitAndPop
将其从队列中删除:
void waitAndPop(Data& poppedValue)
{
boost::mutex::scoped_lock lock(_dataMutex);
while(_queue.empty())
{
_dataAvailable.wait(lock);
}
poppedValue = _queue.front();
_queue.pop();
}
这运行良好,但我随后需要确保 Dispatcher
将相关工作交给同一个 EventHandler
。因此,我实现了一个 waitAndPeek
方法,将 Event
对象留在队列中,但返回指向它的指针。
void waitAndPeek(Data& peekedValue)
{
boost::mutex::scoped_lock lock(_dataMutex);
while(_queue.empty())
{
_dataAvailable.wait(lock);
}
peekedValue = _queue.front();
}
一旦事件处理完成,事件就会从队列中弹出。将事件留在队列中允许 Disptacher 检查队列头部的项目,看它是否与它试图分配的项目相关。 (以互斥保护的方式完成但未显示)
下面是从 EventQueue 中提取指针的代码:
EventPtr event;
// Loop, processing events placed on the queue.
while (true)
{
// Blocking call. Will halt the thread until there is work to do.
_eventQueue->waitAndPeek(event);
// Try to access event but ASSERT fires
int id = event->getId();
...
}
问题是当我使用窥视指针时,intrusive_ptr
代码中触发了一个 ASSERT。
/usr/local/packages/Boost/1.40.0/include/boost/smart_ptr/intrusive_ptr.hpp:166:
T* boost::intrusive_ptr<T>::operator->() const [with T = Event]:
Assertion `px != 0' failed.
一旦我恢复代码以使用 waitAndPop
方法,问题就消失了,是什么导致 ASSERT 仅仅因为我将事件留在队列中而触发?
最佳答案
查看 intrusive_ptr 文档:
http://www.boost.org/doc/libs/1_46_1/libs/smart_ptr/intrusive_ptr.html#indirection
为了取消引用它,它必须持有一个非 NULL 指针。
关于c++ - 在容器中使用时断言在 boost::intrusive_ptr 中触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5512024/
我已经阅读了很多关于 smart ptr 的内容,并决定在我自己的实现中使用 intrusive_ptr 进行引用计数。 也就是说,我现在不得不面对另一个问题,如何解决考虑到 weak_ptr 不能与
我想使用 boost::intrusive_ptr 来引用我的类 x::Y,所以我添加了一个 references 字段和友元声明对于 release 和 add_ref 函数,它们应该在命名空间 b
boost::intrusive_ptr (或自制版本)最简单的样子是这样的: template class intrusive_ptr { public: intrusive_ptr(T*
是否有可能找出要为使用 boost::intrusive_ptr 的库链接哪个库文件? 我尝试使用 boost bcp 工具,但这并没有给出编译 dylib boost::intrusive_ptr
我有 A 类,它使用 boost::intrusive_ptr 保存一些数据: #include "Data.h" class A { boost::intrusive_ptr data; }
我有一个基类,它为子类提供 intrusive_ptr_add_ref 和 intrusive_ptr_release 以与 boost::intrusive_ptr 一起使用。 有问题的代码在 Ma
我正在使用 boost::intrusive_ptr 来处理自动内存管理,但现在我想将它们与池化对象分配结合使用。 Boost Pool 是一个很好的起点,还是有另一种普遍接受的使用“智能指针”进行池
在我的代码中,当涉及到 intrusive_ptrs 时,我遵循两条规则: 按值传递原始指针意味着保证原始指针在该函数的生命周期内有效。 如果要在函数的生命周期之外存储和使用原始指针,则应将其存储在
我正在使用 boost::intrusive_ptr 作为我的引用计数智能指针。我正在使用这样的东西: http://www.codeproject.com/KB/stl/boostsmartptr.
在工作中,我们有一个基类,我们称它为 IntrusiveBase,它的作用类似于混合,允许将类存储在 boost:intrusive_ptr 中。也就是说,它为其子类提供引用计数并定义 intrusi
我读过 article about using boost::intrusive_ptr for managing COM objects .作者展示了一个包装类,它负责为通常的 COM 语义调整智能
具体来说,我需要声明(据我所知)intrusive_ptr_{add_ref,release} 作为我引用类的 friend : #include using boost::intrusive_pt
我有一个生产者-消费者安排来处理来自网络的事件。 Dispatcher 通过工作线程拥有的互斥锁保护队列为多个 EventHandler 线程提供工作。放入队列的事件对象使用boost::intrus
C++11 是否有与 boost::intrusive_ptr 等价的东西? 我的问题是我的 C++ 代码有一个 C 风格的界面。接口(interface)的两端都可以使用 C++,但出于兼容性原因,
我在 boost::intrusive_ptr 中包含一个 Locker 类型的小模板类,我想将其存储在 std::map 中: template bool LockerManager:: Ad
假设我有一个 list类: template class list { ... private: class node { ... private:
违规代码: template class SharedObject { public: typedef boost::intrusive_ptr Pointer; typedef boost
要求 我正在编写一个名为RCObject的类,它表示“引用计数对象”; RCObject类应该是抽象的,用作框架的基类(EC++3项目7); 应该禁止在堆栈上创建RCObject子类的实例(MEC++
我想一次准确地分配一个对象并将其推送到几个列表中。如何使用 boost::intrusive_ptr 执行此操作和 boost::intrusive::list ?或者我应该使用另一个容器和引用计数器
boost::intrusive 文档描述了如何 you can use smart pointers with intrusive containers但接着说你不能使用你最有可能使用的智能指针,“
我是一名优秀的程序员,十分优秀!