小编Chr*_*son的帖子

提升shared_from_this和多重继承

我在使用boost enable_shared_from_this和多重继承时遇到了一些麻烦.

该场景可以描述如下:

  1. A实现了一些功能,应该继承enable_shared_from_this

  2. B实现了另一个功能,应该继承enable_shared_from_this

  3. DAB(class D : public A, public B {})继承功能

  4. 当我B从类中使用一些类功能时,D我得到了一个异常(bad_weak_ptr)

  5. 继承enable_shared_from_this课程D对我来说不是一个选择

我不知道如何解决这个问题.

哦,我正在使用Visual C++ 2010.

c++ multiple-inheritance shared-ptr enable-shared-from-this

13
推荐指数
2
解决办法
5645
查看次数

在几个线程上运行asio strand和io_service

我不确定与股线有关的一个细节.

假设以下情况:两个独立的对象,每个对象都有自己的链.并且每个链与一个共同的io_service相关.每个对象使用他的strand进行发布和包装异步操作.如果我在多个线程上有这个(唯一的)io_service .run(),我不确定是否会发生以下情况:

  1. 其中一个对象发布的所有操作和异步包装将不同时执行.因此,与其中一个对象相关的所有操作都将按顺序执行(已发布的操作将按照与发布时相同的顺序执行.包装的异步操作将以未指定的顺序执行,因为它们是异步的,但仍然是串行执行的).

  2. 两次手术起源于不同的对象(因此发布或与同一io_service对象不同链的对象包装),可以执行并行.

  3. 总之,每个对象将连续执行其发布和包装的处理程序,但是从不同对象(链)发布和包装的处理程序将同时执行.

       +-----------------+  +-----------------+
       | Obj1            |  | Obj2            |
       | +-------------+ |  | +-------------+ |             
       | |   Strand_1  | |  | |   Strand_2  | |               
       | +-------------+ |  | +-------------+ |                
       +--------+--------+  +-------+---------+                
                |                   |                          
                +--------+  +-------+                          
                         |  |                                         
                    +----+--+----+                                      
                    | io_service |                                      
                    +------------+                                      
                           |                                          
                           |                                          
                  +--------+-------+                         
                  |                |                                
             Thread1             Thread_2  
             io_service.run()    io_service.run()                              
    
    Run Code Online (Sandbox Code Playgroud)

我对吗?

谢谢

c++ multithreading asynchronous boost-asio

11
推荐指数
1
解决办法
2848
查看次数

重置 boost::shared_ptr 由来自 lambda 的值捕获

在 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)

c++ lambda pass-by-value shared-ptr

4
推荐指数
1
解决办法
572
查看次数

boost :: asio自定义处理程序分配

我只是试图了解boost :: asio处理程序分配示例(http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/example/allocation/server.cpp)。

我知道这是出于教育目的的过于简化的示例,但是我无法理解:在任何情况下,由于无法看到类,handler_allocator类使用了堆(in_use_ == true)。

每个会话都有自己的分配器,每次都是这样的:先读取再写入,但是直到写入完成才读。您也可以阅读文档:

该实现保证了释放将在调用关联的处理程序之前发生,这意味着该内存已准备好被处理程序启动的任何新异步操作重用。

我的问题是:您能告诉我一个示例,在该示例中堆发生分配的地方吗?

额外:现在有没有人提供处理程序自定义分配的更完整示例?

c++ memory-management boost-asio

0
推荐指数
1
解决办法
1450
查看次数