jjzjj

c - GetOverlappedResult(bWait=TRUE) 与 WaitForSingleObject() 对于重叠 I/O

coder 2024-06-08 原文

当我在 Win32 api 上以 OVERLAPPED 方式打开和读取文件时,我有几种方法来完成 IO 请求,包括使用等待文件句柄(或重叠结构中的事件)

  • WaitForSingleObject
  • GetOverlappedResult 和 bWait=TRUE

这两个函数似乎具有相同的效果:线程停止直到句柄或事件发出信号,这意味着数据被放置在提供给 ReadFile 的缓冲区中。

那么,有什么区别呢?为什么我需要 GetOverlappedResult

最佳答案

我完全同意 Remus Rusanu answer .也改为创建自己的 IOCP 和线程池,它们将在此 IOCP 上监听,您可以使用或 BindIoCompletionCallbackCreateThreadpoolIo (从 vista 开始)- 在这种情况下,系统自己创建 IOCP 并且线程池将监听此 IOCP 并且当某些操作完成时 - 调用您的回调。与自己的 iocp/线程池相比,这是非常简化的代码(我认为自己的 iocp/线程池真的只有当你有非常大的 I/O(比如服务器端的 socket io)并且需要特殊的性能优化时才有意义)

不过

So, what is the difference? Why do I need GetOverlappedResult

如何查看 GetOverlappedResult[Ex] 不仅等待结果,而且

  • 如果操作完成,返回给您NumberOfBytesTransferred
  • 如果操作完成并出现错误 NTSTATUS - 将其转换为 win32 错误并设置最后一个错误
  • 如果操作仍未决并且您想要等待 - 选择等待 hFilehEvent

所以 GetOverlappedResult[Ex] 做的不仅仅是调用 WaitForSingleObject

不过,您自己实现此 API 并不难。例如

BOOL
WINAPI
MyGetOverlappedResult(
                    _In_ HANDLE hFile,
                    _In_ LPOVERLAPPED lpOverlapped,
                    _Out_ LPDWORD lpNumberOfBytesTransferred,
                    _In_ BOOL bWait
                    )
{
    if ((NTSTATUS)lpOverlapped->Internal == STATUS_PENDING)
    {
        if (!bWait)
        {
            SetLastError(ERROR_IO_INCOMPLETE);
            return FALSE;
        }

        if (lpOverlapped->hEvent)
        {
            hFile = lpOverlapped->hEvent;
        }

        if (WaitForSingleObject(hFile, INFINITE) != WAIT_OBJECT_0)
        {
            return FALSE;
        }
    }
    else
    {
        MemoryBarrier();
    }

    *lpNumberOfBytesTransferred = (ULONG)lpOverlapped->InternalHigh;
    NTSTATUS status = (NTSTATUS)lpOverlapped->Internal;
    if (status)
    {
        RtlNtStatusToDosError(status);
    }
    return NT_SUCCESS(status);
}

那还有什么更好的呢:使用 GetOverlappedResult[Ex] 还是自己实现它的功能?

关于c - GetOverlappedResult(bWait=TRUE) 与 WaitForSingleObject() 对于重叠 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42742036/

有关c - GetOverlappedResult(bWait=TRUE) 与 WaitForSingleObject() 对于重叠 I/O的更多相关文章

  1. ruby - 使用 Ruby,计算 n x m 数组的每一列中有多少个 true 的简单方法是什么? - 2

    给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in

  2. ruby - 查找重叠的正则表达式匹配项 - 2

    我想找到给定字符串中的所有匹配项,包括重叠匹配项。我怎样才能实现它?#Example"a-b-c-d".???(/\w-\w/)#=>["a-b","b-c","c-d"]expected#Solutionwithoutoverlappedresults"a-b-c-d".scan(/\w-\w/)#=>["a-b","c-d"],but"b-c"ismissing 最佳答案 在积极的前瞻中使用捕获:"a-b-c-d".scan(/(?=(\w-\w))/).flatten#=>["a-b","b-c","c-d"]参见Rubyde

  3. ruby - 确定字符串的结尾是否与单独的字符串的开头重叠 - 2

    我想查找字符串的结尾是否与单独字符串的开头重叠。例如,如果我有这两个字符串:string_1='Peoplesaynothingisimpossible,butI'string_2='butIdonothingeveryday.'如何找到string_1末尾的“butI”部分与string_2开头相同?我可以编写一个方法来遍历这两个字符串,但我希望得到一个包含我错过的Ruby字符串方法或Ruby习惯用法的答案。 最佳答案 将MARKER设置为一些从未出现在您的string_1和string_2中的字符串。有一些方法可以动态地做到这一

  4. ruby - 检查 ruby 中的两个范围是否重叠 - 2

    我知道我能做到:(1..30).cover?(2)=>true但是当我尝试对另一个范围执行相同操作时,它总是返回false:(1..30).cover?(2..3)=>false所以我的问题是-是否有任何优雅的方法来比较ruby​​中的两个范围?在我的例子中,我想检查两个日期时间范围是否重叠。提前致谢。 最佳答案 给定范围A的两个范围重叠,当:范围B从范围A开始,范围B在范围A内结束或范围B在范围A之前开始,在范围A之后结束例子:RangeA|-----||-----|Case1|-----|Case2|-|Case1+2|----

  5. ruby-on-rails - 对于 Ruby 应用程序,是否有比 Sanitize 更好的替代方案? - 2

    我爱Sanitize.这是一个了不起的实用程序。我遇到的唯一问题是,它需要永远准备一个开发环境,因为它使用Nokogiri,这对编译时间来说是一种痛苦。是否有任何程序可以在不使用Nokogiri的情况下执行Sanitize的操作(如果没有别的,只是温和地执行它的操作)?这将以指数方式提供帮助! 最佳答案 Rails有自己的SanitizeHelper。根据http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html,它将Thissanitizehe

  6. ruby - 在数组中找到 block 返回 true 的第一个元素并返回 block 的返回值 - 2

    我需要遍历数组并将提供的block应用于每个元素,并返回block返回的第一个真值,这意味着我需要在获得真值后立即停止。下面是我的代码。我是ruby新手,我不确定这段代码是否是在重新发明轮子。也许已经有一个或多个库方法可以做到这一点?还是可以简化此代码?RS={:x=>%w(\d+a\d+bb\d+ccc\d+).map{|x|/^#{x}$/},:y=>%w(\w+1\w+22\w+333\w+).map{|x|/^#{x}$/}}.freezedeffinds,tr=RS[s]ifrr.eachdo|p|m=p.matchtreturnmifmendnilendendpfind:x

  7. ruby-on-rails - 对于诸如libyaml之类的已编译库,Ruby(或RVM)在文件系统中搜索哪些位置以加载或解析它们? - 2

    操作系统:CentOS6.2x86_64很抱歉缩进太古怪了。这是我的第一篇SO帖子,我是新来设置服务器的。不过,我正在学习,并将详细说明我尝试解决此问题所采取的步骤以及寻求帮助的地方。我是一位有抱负的年轻Web开发人员,并且我在其他人配置的服务器上工作,因此,这对我来说是全新的。我正在准备我最近购买的用于运行Rails应用程序的linode。我遵循了此处http://blog.blenderbox.com/2011/01/07/installing-rvm-ruby-rails-passenger-nginx-on-centos/提供的初始安装指南,并更改了步骤:sudobash反射(

  8. ruby - IRB - Ruby 1.9.x 哈希语法 : {if: true} is not equal to {:if => true} - 2

    长话短说,我正在编写一个包含选项参数的方法,如果键的值:if评估为真,该方法将执行某些操作。当我使用新语法在IRB中尝试哈希时,我在IRB中遇到语法错误,提示保持打开状态:1.9.3p374:010>{if:true}1.9.3p374:011?>使用旧语法,效果很好:1.9.3p374:011>{:if=>true}=>{:if=>true}开始语句的所有关键字都表现出相同的行为。例如。def,do,module,case出现在中间和class中的其他保留字可以正常工作:else、end我的问题是:这是预期的行为、错误还是限制? 最佳答案

  9. 对于体育新闻中文文本关键字提取有哪些关键字提取算法及其步骤 - 2

    对于体育新闻中文文本的关键字提取,常用的算法包括TF-IDF、TextRank和LDA等。它们的基本步骤如下:1.TF-IDF算法: -将文本进行分词和词性标注处理。-统计每个词在文本中的词频(TF)。-计算每个词在整个语料库中出现的文档频率(DF)和逆文档频率(IDF)。-计算每个词的TF-IDF值,并按照值的大小进行排序,选择排名前几的词作为关键字。2.TextRank算法:-将文本进行分词和词性标注处理。-将分词结果转化成图模型,每个词语为节点,根据词语之间的共现关系建立边。-对图模型进行迭代计算,计算每个节点的PageRank值,表示该节点的重要性。-选择排名前几的节点作为关键字。3.

  10. ruby - 如何测试两个时间范围是否重叠? - 2

    我需要实现预订功能并确保预订不会在Rails应用中重叠。cover?和between?方法并不是我所需要的。与同一模型上的其他潜在范围相比,我必须确保时间范围的唯一性,并且要高效地做到这一点。我认为可以使用overlaps?来完成.问题是,对于这样的事情,它会返回TRUE:(1..5).overlaps?(5..9)=>true如果我比较一个预订在另一个预订开始时结束(3:30-4:00与4:00-4:30),它会说他们做重叠,但他们在技术上没有。那会有问题吗?ValidatesOverlap似乎可以解决这个问题,包括边缘重叠。有什么建议吗? 最佳答案

随机推荐