1

ZeroMQ は、ネットワークによるデータのコピーを可能な限り回避するゼロコピー手法を提供しています。ただし、動作していないようです (ZeroMQ v4.1.5 でテスト済み)。

これはサーバーコードです:

void CustomCleanup(void *data, void *hint)
{
  cout << "free1" << endl;
  delete static_cast<std::string*>(hint);
}

void my_free (void *data, void *hint)
{
    cout << "free2" << endl;
    free (data);
}

int main()
{
    //Allocate a string and zero copy it to client
    std::string* messageString = new string("ABCDEFG");
    cout << messageString->c_str() << endl;

    zmq::context_t context (1);
    zmq::socket_t socket (context, ZMQ_PUSH);
    socket.bind ("tcp://*:5555");

    zmq_msg_t msg;
    zmq_msg_init_data (&msg, messageString, messageString->length(), CustomCleanup, messageString);
    zmq_send (socket, &msg, 7, 0);

    cout << messageString->c_str() << endl;

    //Malloc a data buffer and zero copy it to client
    void *data = malloc (6);
    assert (data);
    memcpy (data, "ABCDEF", 6);
    zmq_msg_t msg2;
    int rc = zmq_msg_init_data (&msg2, data, 6, my_free, NULL); assert (rc == 0);

    zmq_send (socket, &msg2, 6, 0);
}

そして、これはクライアントコードです:

int main()
{
    zmq::context_t context (1);
    zmq::socket_t socket (context, ZMQ_PULL);
    socket.connect ("tcp://127.0.0.1:5555");

    zmq::message_t message;
    socket.recv(&message);
}

zmq_msg_init_dataを呼び出した後、デアロケーターCustomCleanupmy_freeを呼び出して、割り当てられたメモリを解放する必要がありますが、私の場合、これは起こりません。なんで?

注: サーバーの例では、潜在的な障害を特定するために new/malloc と文字列および void ポインターの両方を使用しましたが、どちらの場合も機能しません。

4

0 に答える 0