我在使用boost enable_shared_from_this和多重继承时遇到了一些麻烦.
该场景可以描述如下:
类A实现了一些功能,应该继承enable_shared_from_this
类B实现了另一个功能,应该继承enable_shared_from_this
类D从A和B(class D : public A, public B {})继承功能
当我B从类中使用一些类功能时,D我得到了一个异常(bad_weak_ptr)
继承enable_shared_from_this课程D对我来说不是一个选择
我不知道如何解决这个问题.
哦,我正在使用Visual C++ 2010.
我不确定与股线有关的一个细节.
假设以下情况:两个独立的对象,每个对象都有自己的链.并且每个链与一个共同的io_service相关.每个对象使用他的strand进行发布和包装异步操作.如果我在多个线程上有这个(唯一的)io_service .run(),我不确定是否会发生以下情况:
由其中一个对象发布的所有操作和异步包装将不同时执行.因此,与其中一个对象相关的所有操作都将按顺序执行(已发布的操作将按照与发布时相同的顺序执行.包装的异步操作将以未指定的顺序执行,因为它们是异步的,但仍然是串行执行的).
两次手术起源于不同的对象(因此发布或与同一io_service对象不同链的对象包装),可以执行并行.
总之,每个对象将连续执行其发布和包装的处理程序,但是从不同对象(链)发布和包装的处理程序将同时执行.
+-----------------+ +-----------------+
| Obj1 | | Obj2 |
| +-------------+ | | +-------------+ |
| | Strand_1 | | | | Strand_2 | |
| +-------------+ | | +-------------+ |
+--------+--------+ +-------+---------+
| |
+--------+ +-------+
| |
+----+--+----+
| io_service |
+------------+
|
|
+--------+-------+
| |
Thread1 Thread_2
io_service.run() io_service.run()
Run Code Online (Sandbox Code Playgroud)我对吗?
谢谢
在 lambda 中,由于通过值捕获的变量是使用const限定符存储的,从 lambda 重置 boost::shared_ptr 的正确方法是什么?
class Test {};
auto testPtr(boost::make_shared<Test>());
// Error: shared_ptr captured with const
auto lambda1([testPtr]()
{
testPtr.reset();
});
// Ok: but "testPtr" could be out of scope once the lambda is called
auto lambda2([&testPtr]()
{
testPtr.reset();
});
Run Code Online (Sandbox Code Playgroud)
我想这也许可行:
auto copyOfTestPtr(testPtr);
auto lambda3([&testPtr, copyOfTestPtr]()
{
// is it guaranteed that the variable referenced by &testPtr
// will exist later on?
testPtr.reset();
});
// this reference is not necessary anymore so decrement shared_ptr counter
// …Run Code Online (Sandbox Code Playgroud) 我只是试图了解boost :: asio处理程序分配示例(http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/example/allocation/server.cpp)。
我知道这是出于教育目的的过于简化的示例,但是我无法理解:在任何情况下,由于无法看到类,handler_allocator类使用了堆(in_use_ == true)。
每个会话都有自己的分配器,每次都是这样的:先读取再写入,但是直到写入完成才读。您也可以阅读文档:
该实现保证了释放将在调用关联的处理程序之前发生,这意味着该内存已准备好被处理程序启动的任何新异步操作重用。
我的问题是:您能告诉我一个示例,在该示例中堆发生分配的地方吗?
额外:现在有没有人提供处理程序自定义分配的更完整示例?