[ENet-discuss] Multi-threading ENet the easy way...

Syed Setia Pernama syedhs at yahoo.com
Thu Feb 4 06:04:16 PST 2010


Hi,

I have profiled my server which use enet and found that many enet functions are using quite substantial of cpu processing (~20%). I know probably many of you don't see enet as the bottleneck while profiling, but mine is a little different, it is a server which can send (and receive) 60 packets/second to 5 clients. I know, i know that there are some past postings suggested that this is not the best way to do it (60hz), but as it is now it is running okay. But the more pressing issue now is to increase the performance so we decide to make full use of quad core via multi-threading technique. 

What I am thinking of the easy way to multi-thread enet is to specifically run this:-

std::vector<std::pair<ENetPacket*,ENetPeer*>packets;
while (enet_host_service (mHost, & event, 0) > 0) {
   ...
   switch (event.type) {
     case ENET_EVENT_TYPE_RECEIVE:
       packets.push_back(std::make_pair(event.packet, event.peer));
  ....
}

on thread. The thread will be continuously run 'enet_host_service' function until the server shutdown.

And the enet packet which is stored using 'packets' variable above, will be made available to main thread via another function - 

void getPackets(std::vector<std::pair<ENetPacket*,ENetPeer*>>& packets)

Of course, this function will perform the necessary lock for multithreading so as to prevent the thread from inserting while main thread is reading it.

And that's it. The sending part will be in the main thread. The network thread only concern about receiving packets. 

So the big question is, is the design okay?

TIA.


      


More information about the ENet-discuss mailing list