I / O完成端口何时在多线程设计中增加/减少每个插槽的RefCount?

时间:2018-05-06 08:18:15

标签: windows multithreading sockets atomic iocp

我读了这个问题 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线程和主线程之间同步对此结构的访问吗?

0 个答案:

没有答案