windows - I/O Komplette porte, når du skal øge/mindske RefCount of Per-stikket i et multi-threaded design?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg læser dette spørgsmål
I/O-afslutningsporte * LAST * kaldes tilbagekaldelse, eller: hvor det er sikkert at rydde op ting


Og jeg kan ikke få mit problem løst. Svaret dækker ikke fuldt ud denne metode.
Jeg har også søgt meget her og i google, men kan ikke finde en løsning, så jeg åbner et spørgsmål her håber, der ikke er dupliceret.


I en multi-threaded IO Completion ports design, når skal du øge RefCount af Per Socket-strukturen? dvs. CompletionKey. For øjeblikket øger jeg det før du ringer til WSARecv, og hvis tilbagegivelsesværdien af ​​opkaldet ikke er 0 eller ERROR\_IO\_PENDING efter sidste fejl, reducerer jeg det og kalder en oprydningsfunktion, kontrollerer denne funktion, om [[RefCount er 0, hvis det er så vil det frigøre Per Socket-strukturen. Ellers vil det bare frigøre Per IO strukturen (den ene af OVERLAPPED), jeg øger også den, før du udsteder nogen WSASend på samme måde som nævnt ovenfor. Denne RefCount er atomisk ved hjælp af CRITCAL\_SECTION. Ved retur fra GetQueuedCompletionStatus reducerer jeg også RefCount.


Men jeg har nogle spørgsmål om denne metode


Jeg har en funktion, der sender filer fra hovedtråden, funktionen læser filen og udsteder en PostQueuedCompletionStatus for at sende en sending ved hjælp af WSASend gennem IO Worker-tråder, sender funktionen filen i stykker og når hver chunk fuldender IO Worker-tråde vil informere hovedtråden med PostMessage for at udstede en anden afsendelse af den næste klump.


Nu hvor jeg skal øge dette RefCount? i hovedtråden lige før du udsender et opkald til PostQueuedCompletionStatus? men hvad hvis en retur fra GetQueuedCompletionStatus returnerede og frigjort Per Socket-strukturen og hovedtråden, der stadig bruger den? (Eksempel, at hovedtråden udfører sendfunktionen, men endnu ikke har øget RefCount) Jeg forsøgte at øge RefCount i funktionen WSASend i IO Worker-tråde, men det er det samme problem


For eksempel: Hvad hvis en tråd vågnede op fra GetQueuedCompletionStatus som en stikkontakt (forårsaget af den fremragende WSARecv) og reducere RefCount og det blev 0, så det vil frigøre Per Socket-strukturen mens en WSASend udføres i en anden IO Worker-tråd, men endnu ikke øget RefCount? så er det klart, at tråden, der skal udgive et WSASend opkald, kolliderer med adgangsbrud, når den forsøger at komme ind i det kritiske afsnit.


Enhver ide om, hvordan man synkroniserer adgangen til denne struktur mellem IO Worker-tråde og hovedtråden?

Bedste reference