You mean why we don't just add a lock in serversocket::send? 

I tried that, there's a problem. Adding a lock here we can guarantee there no conflict sending on same ZMQ socket, but this can't guarantee there's no conflict between sending and receiving(while we are sending data other than in poll thread maybe we are receiving data in poll thread). One way we could do is adding lock in poll loop? That may complicate the design.