我读了这个问题 I/O Completion Ports *LAST* called callback, or: where it's safe to cleanup things
我无法解决问题。答案并未完全涵盖此方法。 我也在这里和谷歌搜索了很多,但找不到解决方案所以我在这里打开一个问题,希望不会重复。
在多线程IO中,Completion端口设计何时增加Per Socket结构的RefCount
?即CompletionKey
。目前我确实在调用WSARecv
之前增加它,并且如果调用的返回值不是0或最后一个错误的ERROR_IO_PENDING
,我减少它并调用一个清理函数,这个函数将检查{{1} 1}}为0,如果是,那么它将释放Per Socket结构。否则它将释放Per IO结构(OVERLAPPED),我也会在使用上述相同方式发布任何RefCount
之前增加它。这个WSASend
使用RefCount
是原子的。从CRITCAL_SECTION
返回后,我也减少了GetQueuedCompletionStatus
。
但是我对这个方法有一些疑问
我有一个从主线程发送文件的函数,该函数正在读取文件并发出RefCount
通过IO Worker线程使用PostQueuedCompletionStatus
进行发送,该函数发送文件块和每个块完成后,IO Worker线程将通过WSASend
通知主线程发出下一个块的另一个发送。
现在我应该增加这个PostMessage
?在发出对RefCount
的呼叫之前的主线程中?但是如果从PostQueuedCompletionStatus
返回并返回并释放Per Socket结构并且主线程仍在使用它呢? (示例主线程正在执行send函数但尚未增加GetQueuedCompletionStatus
)我试图在IO Worker线程中的RefCount
函数中增加RefCount
但是它是同一个问题< / p>
例如:如果一个线程从WSASend
作为套接字闭包唤醒(由未完成的GetQueuedCompletionStatus
引起)并递减WSARecv
并且它变为0,那么它将释放每个套接字结构,而RefCount
正在另一个IO Worker线程中执行但尚未增加WSASend
?那么当它试图进入关键部分时,即将发出RefCount
调用的线程显然会因访问冲突而崩溃。
知道如何在IO Worker线程和主线程之间同步对此结构的访问吗?