czmq倍数zactor实例崩溃

时间:2016-03-13 03:07:12

标签: c pthreads zeromq

我正在尝试使用czmq库中的zhash和zactor编写一个基本示例。我想要实现的主要想法是:

  1. 创建1024个zactor实例,并在每个actor创建后发送“START”命令。
  2. 等待演员的响应继续创建zactors。
  3. 删除所有以前创建的演员。
  4. 我有点迷失为什么这个代码会破坏。每当我到达演员编号60时,应用程序退出:

    ...
    ...
    58 actor started!
    START command received!
    59 actor started!
    START command received!
    60 actor started!
    > Assertion failed: (self), function zsock_set_sndtimeo, file
    > src/zsock_option.c, line 1344.
    > Abort trap: 6
    

    编译:{{1​​}}

    代码如下:

    gcc -o demo demo.c -g -lczmq

    有什么想法吗?我不明白为什么我达到这个60的数字限制。

1 个答案:

答案 0 :(得分:1)

你在使用什么操作系统?是OS / X吗?

当前的actor实现仍然使用PAIR套接字,它们在内部使用实际的文件句柄来发送信号。每个actor都有两个PAIR套接字,每个套接字使用两个文件句柄,所以60个actor = 240个文件句柄。

在OS / X上,每个进程的默认限制为256.您可以提高此值,请参阅:http://zeromq.org/docs:tuning-zeromq

在Linux上,默认值为1024,你可以提高它。在Windows上,您需要重新编译libzmq,并将FD_SETSIZE设置为16K或某些(这是libzmq master现在所做的,但旧版本的值较低)。

相当分开:

  • 你不需要任何构造上的握手,因为这已经由zactor_new()完成,你会看到所有演员在他们初始化时发出信号。

  • 除非您实际测试系统限制,否则创建1024个actor可能过多。演员使用系统线程;为获得最佳性能,您需要每个代码一个线程。为了获得最佳设计,每个并发工作线程有一个线程。