<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢(mèng)蝶

    生活、程序、未來(lái)
       :: 首頁(yè) ::  ::  :: 聚合  :: 管理

    再談Selector的wakeup方法

    Posted on 2009-02-01 11:15 dennis 閱讀(3370) 評(píng)論(0)  編輯  收藏 所屬分類: javalinux & C
        過(guò)去推薦過(guò)兩篇blog《Java NIO類庫(kù)Selector機(jī)制解析》(),感嘆java為了跨平臺(tái)似乎“很傻很天真”。最近學(xué)習(xí)使用ACE,才知道這個(gè)解決辦法倒不是java開(kāi)創(chuàng)的,ACE也是這樣搞的。java nio中Selector的wakeup方法,類似于ACE_Select_Reactor的notify機(jī)制,可以從非select調(diào)用的線程去喚醒阻塞在select調(diào)用上的select線程,當(dāng)然ACE_Select_Reactor的notify強(qiáng)大多了,可以實(shí)現(xiàn)event handler的無(wú)限擴(kuò)容。ACE_Select_Reactor的notify的實(shí)現(xiàn)是通過(guò)ACE_Pipe,在ACE_Pipe中可以清晰地看到針對(duì)win32平臺(tái)是采用了TCP連接:

    #if defined (ACE_LACKS_SOCKETPAIR) || defined (__Lynx__)
      ACE_INET_Addr my_addr;
      ACE_SOCK_Acceptor acceptor;
      ACE_SOCK_Connector connector;
      ACE_SOCK_Stream reader;
      ACE_SOCK_Stream writer;
      
    int result = 0;
    if defined (ACE_WIN32)
      ACE_INET_Addr local_any  (static_cast
    <u_short> (0), ACE_LOCALHOST);
    else
      ACE_Addr local_any 
    = ACE_Addr::sap_any;
    # endif 
    /* ACE_WIN32 */

      
    // Bind listener to any port and then find out what the port was.
      if (acceptor.open (local_any) == -1
          
    || acceptor.get_local_addr (my_addr) == -1)
        result 
    = -1;
      
    else
        {
          ACE_INET_Addr sv_addr (my_addr.get_port_number (),
                                 ACE_LOCALHOST);

          
    // Establish a connection within the same process.
          if (connector.connect (writer, sv_addr) == -1)
            result 
    = -1;
          
    else if (acceptor.accept (reader) == -1)
            {
              writer.close ();
              result 
    = -1;
            }
        }

      
    // Close down the acceptor endpoint since we don't need it anymore.
      acceptor.close ();

        在類unix平臺(tái)是采用STREAMS管道,在一些遺留的unix平臺(tái)上是socketpair()。為什么在win32上采用TCP連接的方式呢?原因不是什么性能、資源問(wèn)題,也不是因?yàn)閣indows管道消耗的資源比tcp多,而是由于winsock的select函數(shù)(java nio的select在win32下是使用select實(shí)現(xiàn)的)是無(wú)法監(jiān)測(cè)管道事件的,也就是說(shuō)無(wú)法將windows管道加入到fd_set中,為了做到可移植,才在win32上采用了TCP連接的方式來(lái)實(shí)現(xiàn)。這一點(diǎn)在blog上篇的新回復(fù)中已經(jīng)有人提到。
    主站蜘蛛池模板: 一级免费黄色大片| 亚洲系列国产精品制服丝袜第 | 亚洲AV无码乱码国产麻豆| 国产男女猛烈无遮挡免费视频网站| 亚洲不卡中文字幕| 日韩毛片免费无码无毒视频观看| 免费99热在线观看| 亚洲伊人tv综合网色| 免费大片av手机看片高清| 日韩人妻无码免费视频一区二区三区| 亚洲毛片在线观看| 99久热只有精品视频免费观看17| 亚洲视频手机在线| 99久久精品毛片免费播放| 午夜视频免费成人| 日韩亚洲翔田千里在线| 国产精品视频永久免费播放| 亚洲熟妇少妇任你躁在线观看| 久久国产精品萌白酱免费| 亚洲无码精品浪潮| 怡红院亚洲红怡院在线观看| 亚洲国产成人久久综合野外| a级毛片免费在线观看| 亚洲精品在线网站| 成人毛片18女人毛片免费| 色多多www视频在线观看免费| 成人午夜亚洲精品无码网站| 一区二区三区四区免费视频| 亚洲精品乱码久久久久久按摩| 国产色爽免费无码视频| 亚洲午夜国产精品无码老牛影视| 久久国产精品一区免费下载| 亚洲jizzjizz在线播放久| 国产成人精品免费视频大全麻豆| 亚洲AV无码精品色午夜在线观看| 我的小后妈韩剧在线看免费高清版 | 亚洲一区二区三区无码中文字幕| 免费观看国产网址你懂的| 亚洲AV日韩综合一区| 亚洲成av人片天堂网| 免费无码又爽又刺激毛片|