小编Aru*_*nmu的帖子

在*nix上了解异步编程的基础知识

一段时间以来,我一直在谷歌上搜索有关在nix机器上实现异步编程/行为的各种方法,并且(正如我之前所知)已经确认仍然没有TRULY异步模式(并发)使用单线程)Linux适用于Windows(IOCP).

以下是linux提供的几种替代方案:

  1. select/poll/epoll ::无法使用单个线程完成,因为epoll仍然阻止调用.此外,必须以非阻塞模式打开受监视的文件描述符.
  2. libaio ::我所了解的是,它的实现很糟糕,它仍然是基于通知而不是基于Windows I/O完成端口的完成.
  3. 提升ASIO ::它在linux下使用epoll,因此不是真正的异步模式,因为它产生的线程完全从用户代码中抽象出来以实现proactor设计模式
  4. libevent ::如果我喜欢ASIO,有什么理由可以选择吗?

现在问题来了:)

  1. 使用epoll编写快速可扩展网络服务器的最佳设计模式是什么(当然,这里必须使用线程:()
  2. 我曾在某处读过"只能在非阻塞模式下打开套接字",因此epoll仅支持套接字,因此不能用于磁盘I/O. 上述声明的真实性以及使用epoll无法在磁盘I/O上进行异步编程的原因是什么?
  3. Boost ASIO使用一个围绕epoll呼叫的大锁.我实际上并没有理解它的含义是什么以及如何使用asio本身克服它.类似的问题
  4. 如何修改ASIO模式以使用磁盘文件?有没有推荐的设计模式?

希望有人能够用很好的解释回答所有问题.任何链接到源,其中epoll和AIO设计模式的实现细节是开辟的也是赞赏.

c c++ epoll aio boost-asio

16
推荐指数
1
解决办法
5977
查看次数

'char*'的模板参数推导

我有以下功能(仅用于复制问题):

template <typename KeyT>
void func(const KeyT cptr) {
  std::cout << typeid(KeyT).name() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我想用字符串文字来调用它,如下所示:

func<char*>("literal");
Run Code Online (Sandbox Code Playgroud)

但是,我最终得到了警告:

warning: ISO C++11 does not allow conversion from string literal to 'char *' [-Wc++11-compat-deprecated-writable-strings]

我有一个特定需要使用char*作为我的主要类型,我期待TAD要考虑param typeconst char*全部,因为我不是引用服用.

警告来自两者clangg++编译器.

如何param type推断这里?

提前致谢.

c++ templates c++11

14
推荐指数
2
解决办法
591
查看次数

使用erlang打开设备文件

有没有办法在erlang中打开终端设备文件?

我在Solaris上,我正在尝试以下::

Erlang (BEAM) emulator version 5.6 [source] [64-bit] [async-threads:0] [kernel-poll:false]

/xlcabpuser1/xlc/abp/arunmu/Dolphin/ebin
Eshell V5.6  (abort with ^G)
1> file:open("/dev/pts/2",[write]).
{error,eisdir}
2> file:open("/dev/null",[write]).
{ok,}
3>

从上面可以看出,erlang文件驱动程序在打开空文件时没有问题,但是没有打开终端设备文件!

由于文件驱动程序能够打开空文件,因此无法得出结论.

有没有其他方法可以打开终端设备文件?

谢谢

erlang file-io serial-port file

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

继承和多态的低级细节

这个问题是我头脑中隐藏的一大疑问,也难以用言语来描述.有时似乎很明显,有时候很难破解.所以问题就像这样::

class Base{
public:
     int a_number;

     Base(){}
     virtual void function1() {}
     virtual void function2() {}
     void function3() {}
};

class Derived:public Base{
public:
     Derived():Base() {}
     void function1() {cout << "Derived from Base" << endl; 
     virtual void function4() {cout << "Only in derived" << endl;}
};

int main(){

      Derived *der_ptr = new Derived();
      Base *b_ptr = der_ptr;  // As just address is being passed , b_ptr points to derived                object

      b_ptr -> function4(); // Will Give Compilation ERROR!!

      b_ptr -> function1(); …

c++ polymorphism inheritance vtable

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

读取直到boost :: asio :: streambuf中的字符串分隔符

我想使用非常方便的Boost async_read_until来读取消息,直到我得到\r\n\r\n分隔符.

我喜欢使用这个分隔符,因为它很容易使用telnet进行调试并生成多行命令.我只是通过两条新线发出命令结束的信号.

我打电话async_read_until是这样的:

void do_read()
{
    boost::asio::async_read_until(m_socket,
                                  m_input_buffer,
                                  "\r\n\r\n",
                                  std::bind(&player::handle_read, this, std::placeholders::_1, std::placeholders::_2));
}
Run Code Online (Sandbox Code Playgroud)

我的处理程序现在看起来像这样:

void handle_read(boost::system::error_code ec, std::size_t nr)
{
    std::cout << "handle_read: ec=" << ec << ", nr=" << nr << std::endl;

    if (ec) {
        std::cout << "  -> emit on_disconnect\n";
    } else {
        std::istream iss(&m_input_buffer);
        std::string msg;
        std::getline(iss, msg);

        std::cout << "dump:\n";
        std::copy(msg.begin(), msg.end(), std::ostream_iterator<int>(std::cout, ", "));
        std::cout << std::endl;

        do_read();
    }
}
Run Code Online (Sandbox Code Playgroud)

我想像std::getline示例一样使用,但在我的系统上,这可以保留\r角色.如您所见,如果我连接到服务器并写入hello加上两个CRLF,我会得到这个转储服务器端:

handle_read: …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-asio

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

通过"top"命令在unix中通过单个进程计算Cpu百分比

我想知道"top"命令如何计算任何进程使用的cpu百分比.

我试过在/ proc目录中读取"psinfo"二进制文件,但它没有帮助找到结果.

请提供有关如何完成的任何信息.

提前致谢.

c c++ unix solaris

5
推荐指数
1
解决办法
4352
查看次数

在反汇编代码中跟踪调用堆栈

我正在尝试调试一个棘手的核心转储(来自 -O2 优化的二进制文件)。

// Caller Function 
void caller(Container* c)
{
  std::list < Message*> msgs;
  if(!decoder.called(c->buf_, msgs))
  {
   ....
   .....
  }
// Called Function
bool
Decoder::called(Buffer* buf, list < Message*>& msgs)
{
   add_data(buf); // Inlined code to append buf to decoders buf chain
   while(m_data_in && m_data_in->length() > 0)
   {
     .....
   }
}
Run Code Online (Sandbox Code Playgroud)

在调用者和被调用者中,第一个参数都被优化了,这意味着它必须在寄存器中的某个地方。

来电拆解:

推 %r15
移动 %rdi,%r15
推 %r14
推 %r13
推 %r12
推 %rbp
推 %rbx
子 $0x68,%rsp
测试 %rsi,%rsi
je 0x8ccd62 
cmpq $0x0,(%rsi)
je 0x8ccd62 
lea 0x40(%rsp),%rax
lea …

c c++ assembly gdb x86-64

5
推荐指数
1
解决办法
1551
查看次数

带有ref_qualified成员函数的std :: mem_fn

我们有什么方法可以使用ref合格的成员函数std::mem_fn吗?

以下代码无法编译:

class DeadPool {
public:
  void jump() & {
    std::cout << "Did not jump\n";
  }

  void jump() && {
    std::cout << "Jumped from helicopter\n";
  }
};

int main() {
  DeadPool dp1;
  //auto cobj = std::mem_fn(&DeadPool::jump); // Won't compile
  //cobj(dp1);
  //cobj(DeadPool());
  using Func = void (DeadPool::*) () &; // lvalue ref qualifier explicitly provided
  Func fp = &DeadPool::jump; // This works, as expected
  (std::move(dp1).*fp)();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误信息:

mem_fn_ex.cc:18:15:错误:没有用于调用'mem_fn'的匹配函数
auto cobj = std :: mem_fn(&DeadPool :: jump); //将无法编译^ …

c++ c++11

5
推荐指数
1
解决办法
317
查看次数

Erlang应用程序中观察到的内存泄漏

让我把我的问题简单化如下.我是一个内置erlang的网络路由器软件,但在特定情况下,我观​​察到内存增长非常高,如VM所示.

我有一个进程从socket接收来自其他进程的二进制数据包.

此过程解析二进制数据包并将二进制数据包传递给gen_server(调用handle_cast)

gen_server再次将一些信息存储在ETS表中,并将数据包发送到对等服务器.

当对等服务器响应时,删除来自ETS的条目,并且gen_server响应回第一个进程

此外,如果第一个进程(发送数据包到gen_server)在等待gen_server响应的5秒后得到timedout,它也会删除gen_server中的ETS条目并退出.

现在,当大量事件超时(由于对等服务器不可用)以及我研究了erlang给出的"**binary**"和"**processes_used**"时,我观察到高内存增长:内存命令那就是使用大部分内存.

但是成功处理事件时情况并非如此.

binary erlang memory-leaks

4
推荐指数
2
解决办法
4032
查看次数

无法使用 boost asio TCP 套接字解释较差的带宽性能

下面是我写的一个简单的 TCP 服务器和匹配客户端的例子,开始练习 boost 的 asio 库,Example TCP Client/Server

  • 客户端只是从内存缓冲区中尽可能快地连接和发送数据。
  • 服务器仅侦听消息并打印它从完整消息中获得的字节数。

就是这样——仅此而已。Booth 示例在几个线程上运行,大部分使用默认设置,没有可能会丢掉东西的随意放置的睡眠......它们真的很容易理解,除了直接调用以提高目标之外几乎没有别的隔离问题。

问题是,客户端的输出如下:

Mbytes/sec: 51.648908, Gbytes/sec: 0.051649, Mbits/sec: 413.191267, Gbits/sec: 0.413191

笔记:

  • 我现在正在用电池供电运行我的笔记本电脑。如果我将它插入电源插孔,它会跳到 ~0.7 Gbits/sec。
  • 我尝试将 2048 字节的小消息发送到当前的 8 兆字节消息。
  • 我试过启用和禁用 nagle 算法。
  • 我试过调整发送和接收操作系统缓冲区的大小。
  • 所有这些都通过环回运行,127.0.0.1.
  • 通过 Wireshark 监控环回显示相同的低带宽使用率。

促使我写这个问题的实际点是这个。所述的iperf工具能够实现33.0比特/秒使用TCP经由本地主机。

$ iperf --client 127.0.0.1
------------------------------------------------------------
Client connecting to 127.0.0.1, TCP port 5001
TCP window size: 2.50 MByte (default)
------------------------------------------------------------
[  3] local 127.0.0.1 port 41952 connected with 127.0.0.1 port 5001
[ ID] …
Run Code Online (Sandbox Code Playgroud)

c++ networking tcp boost-asio

3
推荐指数
1
解决办法
2998
查看次数

我无法理解为什么输出在这个for循环中变为10

任何人都可以清楚我的怀疑..为什么这个程序给出10作为输出.你能解释一下机制吗... for循环也有; 在陈述之前

#include <iostream>
using namespace std;

int main() {
    int i ;
    for ( i =0 ; i<10 ; i++);
    {
      cout<<i ;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ loops for-loop cstdio

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

在常规文件的阻止读取系统调用上进行EAGAIN

因此,这是一个奇怪的案例,我有时会看到却无法找出原因。

我们有一个从常规文件读取的C程序。还有其他写入同一文件的进程。该应用程序基于以下事实:在Linux中,写操作是原子的,最大写操作大小为4096字节。

该文件未使用非阻塞标志打开,因此我的假设是读取将被阻塞。

但有时在启动过程中,我们会在中看到“ 资源暂时不可用 ”错误errno。读取的!= -1返回的大小,但部分读取的大小。

错误消息如下所示:

 2018-08-07T06:40:52.991141Z,无效的邮件大小,log_s.bin,fd 670,资源暂时不可用,读取大小285,预期大小525

我的问题是:

  1. 为什么我们要EAGAIN阻止文件读取?

  2. 为什么返回值不是-1?

  3. 这仅在启动时的初始时间内发生。此后工作正常。在这种情况下,有哪些极端情况可以使我们陷入困境?

c linux posix input errno

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

C++ 基类中无法访问的构造函数

    class Timp {

    // constructori
    Timp() {
        this->timp_intre_taste = 0;
        this->timp_tasta = 0;
    }

    Timp(int t1, int t2) {
        this->timp_intre_taste = t1;
        this->timp_tasta = t2;
    }
    // getteri and setteri 

    int getTimpIntreTaste(){
        return timp_intre_taste;}
    void setTimpIntreTaste(int timpIntreTaste){
        timp_intre_taste = timpIntreTaste;}

    int getTimpTasta()
    {
        return timp_tasta;
    }
    void setTimpTasta(int timpTasta)
    {
        timp_tasta = timpTasta;
    }

protected:
    int timp_intre_taste;
    int timp_tasta;

};

class Sesiune : public Timp 
{

    int id_utilizator;
    int nr_click_stanga;
    int nr_click_dreapta;

public:
    Sesiune():Timp(0,0)
    {
        this->id_utilizator = 0;
        this->nr_click_dreapta = …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance constructor

-1
推荐指数
1
解决办法
6650
查看次数