windows - I/O Komplette porte, når du skal øge/mindske RefCount of Per-stikket i et multi-threaded design?
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 problemFor 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?