小编Sam*_*ler的帖子

Bluegene系统是否支持有限公司或任何其他类型的dlopen()支持?

所以我有一些dlopen用于加载库的代码,我希望它能在bluegene系统上运行,但是我没有一个蓝色基因来测试,我从来没有直接使用它.bluegene支持ltdl.h,还是使用其他东西?如果是这样,它有什么用?

c++ hpc loading dynamic libtool

6
推荐指数
1
解决办法
144
查看次数

在动态加载的库之间共享boost :: asio :: io_service对象

首先我做了什么(如果不仅仅是我做了一些非常愚蠢的事情,将提供最小样本):

我有一个GUI应用程序,它将支持多个网络接口来更改GUI中显示的内容.网络接口实现为在GUI启动时动态加载的插件.GUI应用程序提供了一个boost :: asio :: io_service对象,它通过对接口的引用传递,因此可以使用它来构建异步I/O. 在GUI线程中,将轮询此io_service对象以同步网络接口对内容的访问.

现在的问题是,在轮询时,io_service对象不会调用处理程序.为了缩小这个范围,我只实现了一个接口并在其中创建了io_service对象,仍然从GUI线程调用轮询并且可以工作.

我现在的问题是:将io_service对象传递给运行时加载的DLL函数是否有可能存在一般性问题?

如果情况太不清楚,我将提供一个最低限度的例子.

编辑:我觉得真的很愚蠢:)只是把最小的例子一起砍掉了 - 当然 - 就像一个魅力.这几乎意味着问题起源于该软件的其他部分.

所以感谢大家的投入!

要使这个问题至少有用一点:任何想要做类似事情的人(通过boost :: asio :: io_service进行网络同步的插件),你可以在这里下载最小的例子.

c++ dll boost boost-asio

6
推荐指数
1
解决办法
1163
查看次数

在io_service :: stop()之后,在io_service :: ~io_service()中调用boost :: asio - asio_handler_deallocate

我有一个ip::udp::socket带有一个io_service.只有一个boost::thread调用io_service::run()方法,以及一个io_service::work防止io_service::run()返回的实例.我的完成处理程序ip::udp::socket有自定义asio_handler_allocate()asio_handler_deallocate()功能,由一个支持my::custom_memory_pool.

当我的应用程序退出时,这个事件序列发生在我的关闭线程上:

  1. ip::udp::socket::close()
  2. work::~work()
  3. io_service::stop()
  4. thread::join()
  5. my::custom_memory_pool::~custom_memory_pool()
  6. ip::udp::socket::~socket()
  7. thread::~thread()
  8. io_service::~io_service()

在步骤8中,调用io_service::~io_service()原因...

Program terminated with signal 11, Segmentation fault.
#0  0x00000000005ad93c in my::custom_memory_pool<boost::aligned_storage<512u, -1u> >::deallocate (this=0x36323f8, t=0x7fca97a07880)
    at memory.hpp:82
82                      reinterpret_cast<pool_node*>(t)->next_ = head_;
(gdb) bt 30
#0  0x00000000005ad93c in my::custom_memory_pool<boost::aligned_storage<512u, -1u> >::deallocate (this=0x36323f8, t=0x7fca97a07880)
    at memory.hpp:82
#1  0x00000000005ad40a in asio_handler_deallocate (p=0x7fca97a07880, s=96, h=0x7fffe09d5480) at net.cpp:22
#2  0x0000000000571a07 in boost_asio_handler_alloc_helpers::deallocate<socket_multicast::completion_handler> …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-asio

6
推荐指数
1
解决办法
2378
查看次数

链接boost库

我已经下载了boost库(版本1.46.1),但我不知道如何通过xcode链接它.我发现一个老问题说要放-lfftw3标志,所以我已经把它.
我还添加了路径:/ home/Documents/C++/boost_1_46_1(这是我放置库的目录),但是我从链接器收到错误:

ld: warning: directory not found for option '-L/home/ramy/Documents/C++/boost_1_46_1'
ld: library not found for -lfftw3
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Command /Developer/usr/bin/clang++ failed with exit code 1  
Run Code Online (Sandbox Code Playgroud)

所以问题是两个:
1)如何管理xcode链接提升?
2)将库放在文件系统中的位置?在linux中有/ usr/lib,这里没有这条路径,我应该把它放在/ Developer/usr/lib中吗?

c++ xcode linker boost

6
推荐指数
1
解决办法
2万
查看次数

Boost.Asio解析器的结果不同

我有一个罐装再生器boost::asio::ip::tcp::resolver::resolve(),localhost每5秒钟调用一次.它计算返回的端点数,并将该值与上一次迭代进行比较.

#include <boost/asio.hpp>

#include <iostream>

int main(int argc, char *argv[])
{
    if ( argc < 3 ) {
        std::cerr << argv[0] << " host port" << std::endl;
        exit( EXIT_FAILURE );
    }
    const char* host = argv[1];
    const char* service = argv[2];

    boost::asio::io_service io_service;
    boost::asio::ip::tcp::resolver resolver( io_service );

    size_t previous = 0;
    while ( true ) {
        boost::asio::ip::tcp::resolver::iterator i(
                resolver.resolve(
                    boost::asio::ip::tcp::resolver::query( host, service )
                    )
                );
        size_t count( 0 );
        while ( i != boost::asio::ip::tcp::resolver::iterator() ) { …
Run Code Online (Sandbox Code Playgroud)

c++ sockets boost boost-asio getaddrinfo

6
推荐指数
1
解决办法
2373
查看次数

boost :: asio异步条件

我们的想法是能够在消费者/生产者问题上用boost :: asio和线程池替换多线程代码.目前,每个消费者线程等待boost::condition_variable- 当生产者向队列添加内容时,它调用notify_one/ notify_all通知所有消费者.现在当你(可能)拥有1k +消费者时会发生什么?线程不会扩展!

我决定使用boost::asio,但后来我遇到了它没有条件变量的事实.然后async_condition_variable诞生了:

class async_condition_variable
{
private:
    boost::asio::io_service& service_;
    typedef boost::function<void ()> async_handler;
    std::queue<async_handler> waiters_;

public:
    async_condition_variable(boost::asio::io_service& service) : service_(service)
    {
    }

    void async_wait(async_handler handler)
    {
        waiters_.push(handler);
    }

    void notify_one()
    {
        service_.post(waiters_.front());
        waiters_.pop();
    }

    void notify_all()
    {
        while (!waiters_.empty()) {
            notify_one();
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

基本上,每个消费者都会打电话async_condition_variable::wait(...).然后,制作人最终会打电话async_condition_variable::notify_one()async_condition_variable::notify_all().将调用每个消费者的句柄,并且可以根据条件行事或async_condition_variable::wait(...)再次致电.这是可行的还是我在这里疯了?应该执行什么样的锁定(互斥),因为这将在线程池上运行?

PS:是的,这更像是一个RFC(征求意见)而不是一个问题:).

c++ multithreading boost boost-asio

6
推荐指数
1
解决办法
2243
查看次数

Boost asio tcp socket可用报告错误的字节数

在SSL客户端服务器模型中,我使用下面的代码从客户端或服务器端的套接字读取数据.

我只在有可用数据时读取数据.要知道,当有可用的数据,我检查available()的方法lowest_layer()asio::ssl::stream.在我从客户端向服务器发送380个字节并在服务器上输入read方法后,我看到以下内容.

's'是我提供的缓冲区.
'n'是我提供的缓冲区的大小.
'a1'是读取之前的available()的结果,将报告458个字节.
'r'是实际读取的字节数.它将报告380,这是正确的.
'a2'是读取后的available()的结果,将报告0字节.这是我所期望的,因为我的客户端发送了380个字节,而且我已经读完了所有内容.

为什么第一次调用available()报告太多字节?

类型:

/**
 * Type used as SSL Socket. Handles SSL and socket functionality.
 */
typedef boost::asio::ssl::stream<boost::asio::ip::tcp::socket> SslSocket;
/**
 * A shared pointer version of the SSL Socket type.
 */
typedef boost::shared_ptr<SslSocket>                           ShpSslSocket;
Run Code Online (Sandbox Code Playgroud)

成员:

ShpSslSocket                     m_shpSecureSocket; 
Run Code Online (Sandbox Code Playgroud)

部分读取方法:

std::size_t a1 = 0;
if ((a1 = m_shpSecureSocket->lowest_layer().available()) > 0)
{
   r += boost::asio::read(*m_shpSecureSocket,
                          boost::asio::buffer(s, n),
                          boost::asio::transfer_at_least(1));
}

std::size_t a2 = m_shpSecureSocket->lowest_layer().available();
Run Code Online (Sandbox Code Playgroud)

补充信息:

所以我改变了我的read方法,以便更彻底地检查是否还有可以从boost :: asio :: ssl …

c++ boost boost-asio

6
推荐指数
1
解决办法
1178
查看次数

我为什么要使用io_service :: work?

我是升压编程的新手,我一直在寻找使用它的理由io_service::work,但我无法弄明白; 在我的一些测试中,我删除它并正常工作.

c++ boost boost-asio

6
推荐指数
2
解决办法
3238
查看次数

链接到boost :: program_options无法正常工作

存在以下库文件:

cls /usr/local/Cellar/boost/1.51.0/lib $ ls libboost_program*
libboost_program_options-mt.a       libboost_program_options-mt.dylib
Run Code Online (Sandbox Code Playgroud)

我包括以下标题#include <boost/program_options.hpp>:

cls /usr/local/Cellar/boost/1.51.0/include $ ls boost/program_options.hpp
boost/program_options.hpp
Run Code Online (Sandbox Code Playgroud)

我尝试链接库

-lboost_program_options-mt
-L/usr/local/Cellar/boost/1.51.0/lib
Run Code Online (Sandbox Code Playgroud)

(我假设库的名称是从文件名减去"lib"和文件结尾派生的.如果我尝试名字boost_program_options(没有-mt),我得到ld: library not found for -lboost_program_options)

这是我使用库的主要功能:

#include <boost/program_options.hpp>
#include <iostream

int main(int argc, char **argv) {

    namespace opts = boost::program_options;

    opts::options_description desc("EnsembleClustering options");
    desc.add_options()
            ("hello", "produce greeting");

    opts::variables_map vmap;
    opts::store(opts::parse_command_line(argc, argv, desc), vmap);
    opts::notify(vmap);

    if (vmap.count("hello")) {
        std::cout << "Hello World" << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么这个设置会给我一个symbol(s) not found错误?

make all …
Run Code Online (Sandbox Code Playgroud)

c++ linker boost boost-program-options

6
推荐指数
1
解决办法
4988
查看次数

Boost asio - 与不同服务器的多个客户端连接

我正在尝试使用async boost udp/tcp套接字操作来评估我的应用程序的同步.我一直试图找到一个类似于我的设计的例子,但没有找到任何让我相信我可能试图将异步操作放入我的设计的东西,即使它不是正确的路径.

我想连接到多个(读取:1-10之间)服务器并使用不同的协议与它们通信; 我有4-5个线程,它们产生的数据需要传递给这些服务器连接中的任何一个.

我当前的设计是同步的,io_service每个服务器连接线程使用一个对象,然后在生成线程和每个连接线程之间使用线程安全队列.

这种设计在吞吐量性能方面似乎不具备可扩展性,这是我想要最大化的.

是否有任何示例可以为不同的服务器模式提供多个连接?

c++ boost-asio

6
推荐指数
1
解决办法
5700
查看次数