2016-12-05 3 views
0

Was ich tun möchte, ist die folgende: So habe ich 4 Threads. und für jeden Thread erstelle ich einen IOCP. innerhalb der Thread-Funktion Ich warte auf GetQueuedCompletionStatus (INIFINIT) , um einen Job zu bekommen und dann verarbeiten Sie es und dann warten Sie noch einmal.Windows IOCP-Baum?

Also wenn ich einen Auftrag an einen bestimmten Thread senden möchte, ich nur PostQueuedCompletionStatus auf seiner IOCP.

Aber was ich will, ist wie ein Master IOCP und innerhalb der Thread-Funktion. Ich GetQueuedCompletionStatus auf dem Master-IOCP, so wenn ich Job auf Master-IOCP-Random-Thread posten Job und verarbeitet es, aber ich möchte immer noch bestimmte Aufträge für bestimmte Thread senden. Wie kann ich das machen? Vielen Dank! Danke.

Antwort

0

ok, ich habe es selbst gemacht, danke.

ist dies die post_job Funktion i schrieb:

bool WINAPI world_server_process_job_async(job* j) 
{ 
    if (j->type == J_W_RESOLVE) 
    { 
     for (uint32 i = 0; i < w_server.no_of_threads; i++) 
      if (!PostQueuedCompletionStatus(w_server.world_worker_threads[i]->iocp, sizeof(job), NULL, (LPOVERLAPPED)j)) 
       w_server.resolve_drop_count++; 
    } 
    else 
    { 
     for (uint32 i = 0; i < w_server.no_of_threads; i++) 
      if (w_server.world_worker_threads[i]->state == WORKER_INACTIVE) 
       return PostQueuedCompletionStatus(w_server.world_worker_threads[i]->iocp, sizeof(job), NULL, (LPOVERLAPPED)j) ? true : false; 

     bool result = PostQueuedCompletionStatus(w_server.world_worker_threads[w_server.last_to_do_work]->iocp, sizeof(job), NULL, (LPOVERLAPPED)j) ? true : false; 
     if ((++w_server.last_to_do_work) >= w_server.no_of_threads) w_server.last_to_do_work = 0; 
     return result; 
    } 
} 
Verwandte Themen