亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
樓主: yulihua49
打印 上一主題 下一主題

[其他] 事件響應(yīng)方式 [復(fù)制鏈接]

論壇徽章:
15
射手座
日期:2014-11-29 19:22:4915-16賽季CBA聯(lián)賽之青島
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16賽季CBA聯(lián)賽之四川
日期:2017-02-07 21:08:572015年亞冠紀(jì)念徽章
日期:2015-11-06 12:31:58每日論壇發(fā)貼之星
日期:2015-08-04 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-08-04 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-07-12 22:20:002015亞冠之浦和紅鉆
日期:2015-07-08 10:10:132015亞冠之大阪鋼巴
日期:2015-06-29 11:21:122015亞冠之廣州恒大
日期:2015-05-22 21:55:412015年亞洲杯之伊朗
日期:2015-04-10 16:28:25
11 [報告]
發(fā)表于 2016-08-15 16:24 |只看該作者
本帖最后由 yulihua49 于 2016-08-15 16:25 編輯

不能發(fā)代碼,發(fā)了就沒了。
/*******************************************
* 需要linux 2.6.22 以上版本
* 和libaio 3.107以上版本
* 如果不具備這個條件,在makefile里用SIO_fd.o
* 取代本模塊
*******************************************/

#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/eventfd.h>
#include <libaio.h>

#include <scsrv.h>

static int AIO_oper(int fd,char *buff,size_t iosize,int flg)
{
io_context_t myctx;
int rc,num;
uint64_t finished_aio;
struct iocb _iocb,*io=&_iocb;
struct io_event event;
int     efd = eventfd(0, 0);
T_YIELD yield=get_yield();

        if (efd == -1) {   
                return flg?write(fd,buff,iosize):read(fd,buff,iosize);
        }   

        memset(&myctx,0,sizeof(myctx));
        io_set_eventfd(io,efd);
        io_queue_init(1, &myctx);
        if(flg) io_prep_pread(io, fd, buff, iosize, 0);
        else    io_prep_pwrite(io, fd, buff, iosize, 0);
        rc = io_submit(myctx, 1, &io);
        if(rc<0) {
                close(efd);
                io_destroy(myctx);
                return flg?write(fd,buff,iosize):read(fd,buff,iosize);
        }
        if(yield) {
                rc = yield(efd,0,0);//efd提交給epoll,并yield and resume.
                if(rc==0) eventfd_read(efd, &finished_aio);
        }
        close(efd);
        num = io_getevents(myctx, 1, 1, &event, NULL);
        if(num>0) {
                if(event.res2==0) num=event.res;
                else num=-1;
        }
        io_destroy(myctx);
        return num;
}

int AIO_read(int fd,char *buff,size_t iosize)
{
        return AIO_oper(fd,buff,iosize,0);
}

int AIO_write(int fd,char *buff,size_t iosize)
{
        return AIO_oper(fd,buff,iosize,1);
}

論壇徽章:
36
子鼠
日期:2013-08-28 22:23:29黃金圣斗士
日期:2015-12-01 11:37:51程序設(shè)計版塊每日發(fā)帖之星
日期:2015-12-14 06:20:00CU十四周年紀(jì)念徽章
日期:2015-12-22 16:50:40IT運維版塊每日發(fā)帖之星
日期:2016-01-25 06:20:0015-16賽季CBA聯(lián)賽之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16賽季CBA聯(lián)賽之福建
日期:2016-04-07 11:25:2215-16賽季CBA聯(lián)賽之青島
日期:2016-04-29 18:02:5915-16賽季CBA聯(lián)賽之北控
日期:2016-06-20 17:38:50技術(shù)圖書徽章
日期:2016-07-19 13:54:03程序設(shè)計版塊每日發(fā)帖之星
日期:2016-08-21 06:20:00
12 [報告]
發(fā)表于 2016-08-16 14:45 |只看該作者
eventfd看了下,類似pipe

論壇徽章:
36
子鼠
日期:2013-08-28 22:23:29黃金圣斗士
日期:2015-12-01 11:37:51程序設(shè)計版塊每日發(fā)帖之星
日期:2015-12-14 06:20:00CU十四周年紀(jì)念徽章
日期:2015-12-22 16:50:40IT運維版塊每日發(fā)帖之星
日期:2016-01-25 06:20:0015-16賽季CBA聯(lián)賽之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16賽季CBA聯(lián)賽之福建
日期:2016-04-07 11:25:2215-16賽季CBA聯(lián)賽之青島
日期:2016-04-29 18:02:5915-16賽季CBA聯(lián)賽之北控
日期:2016-06-20 17:38:50技術(shù)圖書徽章
日期:2016-07-19 13:54:03程序設(shè)計版塊每日發(fā)帖之星
日期:2016-08-21 06:20:00
13 [報告]
發(fā)表于 2016-08-16 14:50 |只看該作者
原來這幾個是新API,我*nix c 還停留在apue unp范圍。

c/c++實現(xiàn)的協(xié)程我是無愛的。。。

論壇徽章:
15
射手座
日期:2014-11-29 19:22:4915-16賽季CBA聯(lián)賽之青島
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16賽季CBA聯(lián)賽之四川
日期:2017-02-07 21:08:572015年亞冠紀(jì)念徽章
日期:2015-11-06 12:31:58每日論壇發(fā)貼之星
日期:2015-08-04 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-08-04 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-07-12 22:20:002015亞冠之浦和紅鉆
日期:2015-07-08 10:10:132015亞冠之大阪鋼巴
日期:2015-06-29 11:21:122015亞冠之廣州恒大
日期:2015-05-22 21:55:412015年亞洲杯之伊朗
日期:2015-04-10 16:28:25
14 [報告]
發(fā)表于 2016-08-16 17:57 |只看該作者
發(fā)個代碼還等一天審核,還不告知,以為丟了呢,沒興趣了。

論壇徽章:
15
射手座
日期:2014-11-29 19:22:4915-16賽季CBA聯(lián)賽之青島
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16賽季CBA聯(lián)賽之四川
日期:2017-02-07 21:08:572015年亞冠紀(jì)念徽章
日期:2015-11-06 12:31:58每日論壇發(fā)貼之星
日期:2015-08-04 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-08-04 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-07-12 22:20:002015亞冠之浦和紅鉆
日期:2015-07-08 10:10:132015亞冠之大阪鋼巴
日期:2015-06-29 11:21:122015亞冠之廣州恒大
日期:2015-05-22 21:55:412015年亞洲杯之伊朗
日期:2015-04-10 16:28:25
15 [報告]
發(fā)表于 2016-08-18 10:18 |只看該作者
本帖最后由 yulihua49 于 2016-08-18 10:21 編輯
cokeboL 發(fā)表于 2016-08-16 14:50
原來這幾個是新API,我*nix c 還停留在apue unp范圍。

c/c++實現(xiàn)的協(xié)程我是無愛的。。。

c的協(xié)程,實現(xiàn)機(jī)制和resume條件都是明確的。epoll有響應(yīng)了就resume。別的語言,暈。就一個yield,啥時候能resume不知道。一般是輪到你了就resume。這不符合要求。
一般協(xié)程是配合AIO/NIO的,如果干的好好的為什么要yield呢?一定是等什么事件,干不下去了才需要yield。這個需求,其他語言是怎么實現(xiàn)的?

論壇徽章:
36
子鼠
日期:2013-08-28 22:23:29黃金圣斗士
日期:2015-12-01 11:37:51程序設(shè)計版塊每日發(fā)帖之星
日期:2015-12-14 06:20:00CU十四周年紀(jì)念徽章
日期:2015-12-22 16:50:40IT運維版塊每日發(fā)帖之星
日期:2016-01-25 06:20:0015-16賽季CBA聯(lián)賽之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16賽季CBA聯(lián)賽之福建
日期:2016-04-07 11:25:2215-16賽季CBA聯(lián)賽之青島
日期:2016-04-29 18:02:5915-16賽季CBA聯(lián)賽之北控
日期:2016-06-20 17:38:50技術(shù)圖書徽章
日期:2016-07-19 13:54:03程序設(shè)計版塊每日發(fā)帖之星
日期:2016-08-21 06:20:00
16 [報告]
發(fā)表于 2016-08-18 10:38 |只看該作者
回復(fù) 15# yulihua49


我最初看lua的協(xié)程就不喜歡,因為要手動yield resume,而且lua又難利用多核,所以連深入研究的興趣都沒有
我不喜歡c的協(xié)程,也是因為手動檔,這種跟golang erlang比,寫法太麻煩太弱雞了,erlang golang的可以看
成是線程那樣,調(diào)度是應(yīng)用層實現(xiàn)也不需要自己操心,清爽干凈得多。。。

論壇徽章:
36
子鼠
日期:2013-08-28 22:23:29黃金圣斗士
日期:2015-12-01 11:37:51程序設(shè)計版塊每日發(fā)帖之星
日期:2015-12-14 06:20:00CU十四周年紀(jì)念徽章
日期:2015-12-22 16:50:40IT運維版塊每日發(fā)帖之星
日期:2016-01-25 06:20:0015-16賽季CBA聯(lián)賽之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16賽季CBA聯(lián)賽之福建
日期:2016-04-07 11:25:2215-16賽季CBA聯(lián)賽之青島
日期:2016-04-29 18:02:5915-16賽季CBA聯(lián)賽之北控
日期:2016-06-20 17:38:50技術(shù)圖書徽章
日期:2016-07-19 13:54:03程序設(shè)計版塊每日發(fā)帖之星
日期:2016-08-21 06:20:00
17 [報告]
發(fā)表于 2016-08-18 10:45 |只看該作者
golang一個簡單的轉(zhuǎn)發(fā)網(wǎng)關(guān)

  1. import (
  2.         "fmt"
  3.         "net"
  4. )

  5. func newAgentConn(clientConn *net.TCPConn, serverAddr string) {
  6.         serverConn, dailErr := net.Dial("tcp", serverAddr)

  7.         if dailErr == nil {
  8.                 c2sCor := func() {
  9.                         defer func() {
  10.                                 _ = recover()
  11.                         }()

  12.                         var nread int
  13.                         var nwrite int
  14.                         var err error
  15.                         var buf = make([]byte, 1024)
  16.                         for {
  17.                                 nread, err = clientConn.Read(buf)
  18.                                 if err != nil {
  19.                                         clientConn.Close()
  20.                                         serverConn.Close()
  21.                                         break
  22.                                 }

  23.                                 nwrite, err = serverConn.Write(buf[:nread])
  24.                                 if nwrite != nread || err != nil {
  25.                                         clientConn.Close()
  26.                                         serverConn.Close()
  27.                                         break
  28.                                 }
  29.                         }
  30.                 }

  31.                 s2cCor := func() {
  32.                         defer func() {
  33.                                 _ = recover()
  34.                         }()

  35.                         var nread int
  36.                         var nwrite int
  37.                         var err error
  38.                         var buf = make([]byte, 1024)
  39.                         for {
  40.                                 nread, err = serverConn.Read(buf)
  41.                                 if err != nil {
  42.                                         clientConn.Close()
  43.                                         serverConn.Close()
  44.                                         break
  45.                                 }

  46.                                 nwrite, err = clientConn.Write(buf[:nread])
  47.                                 if nwrite != nread || err != nil {
  48.                                         clientConn.Close()
  49.                                         serverConn.Close()
  50.                                         break
  51.                                 }
  52.                         }
  53.                 }

  54.                 go c2sCor()
  55.                 go s2cCor()
  56.         } else {
  57.                 clientConn.Close()
  58.         }
  59. }

  60. func RunAgent(agentAddr string, serverAddr string) {
  61.         tcpAddr, err := net.ResolveTCPAddr("tcp4", agentAddr)
  62.         if err != nil {
  63.                 fmt.Println("ResolveTCPAddr Error: ", err)
  64.                 return
  65.         }

  66.         listener, err2 := net.ListenTCP("tcp", tcpAddr)
  67.         if err2 != nil {
  68.                 fmt.Println("ListenTCP Error: ", err2)
  69.                 return
  70.         }

  71.         defer listener.Close()

  72.         fmt.Println(fmt.Sprintf("Agent Start Running on: Agent(%s) -> Server(%s)!", agentAddr, serverAddr))
  73.         for {
  74.                 conn, err := listener.AcceptTCP()

  75.                 if err != nil {
  76.                         fmt.Println("AcceptTCP Error: ", err2)
  77.                 } else {
  78.                         go newAgentConn(conn, serverAddr)
  79.                 }
  80.         }
  81. }

  82. func TestAgent() {
  83.         Run("127.0.0.1:8888", "127.0.0.1:9999")
  84. }
復(fù)制代碼

論壇徽章:
15
射手座
日期:2014-11-29 19:22:4915-16賽季CBA聯(lián)賽之青島
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16賽季CBA聯(lián)賽之四川
日期:2017-02-07 21:08:572015年亞冠紀(jì)念徽章
日期:2015-11-06 12:31:58每日論壇發(fā)貼之星
日期:2015-08-04 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-08-04 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-07-12 22:20:002015亞冠之浦和紅鉆
日期:2015-07-08 10:10:132015亞冠之大阪鋼巴
日期:2015-06-29 11:21:122015亞冠之廣州恒大
日期:2015-05-22 21:55:412015年亞洲杯之伊朗
日期:2015-04-10 16:28:25
18 [報告]
發(fā)表于 2016-08-18 11:01 |只看該作者
本帖最后由 yulihua49 于 2016-08-18 11:03 編輯
cokeboL 發(fā)表于 2016-08-18 10:45
golang一個簡單的轉(zhuǎn)發(fā)網(wǎng)關(guān)

不懂golang。
沒看見多線程。
err = clientConn.Read(buf)--------這個需要yield,怎樣實現(xiàn)的?沒有yield就成了1:1的事件等待。

論壇徽章:
36
子鼠
日期:2013-08-28 22:23:29黃金圣斗士
日期:2015-12-01 11:37:51程序設(shè)計版塊每日發(fā)帖之星
日期:2015-12-14 06:20:00CU十四周年紀(jì)念徽章
日期:2015-12-22 16:50:40IT運維版塊每日發(fā)帖之星
日期:2016-01-25 06:20:0015-16賽季CBA聯(lián)賽之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16賽季CBA聯(lián)賽之福建
日期:2016-04-07 11:25:2215-16賽季CBA聯(lián)賽之青島
日期:2016-04-29 18:02:5915-16賽季CBA聯(lián)賽之北控
日期:2016-06-20 17:38:50技術(shù)圖書徽章
日期:2016-07-19 13:54:03程序設(shè)計版塊每日發(fā)帖之星
日期:2016-08-21 06:20:00
19 [報告]
發(fā)表于 2016-08-18 11:38 |只看該作者
go c2sCor()
go s2cCor()
這兩句就是啟動兩個協(xié)程,然后
err = clientConn.Read(buf)
nwrite, err = serverConn.Write(buf[:nread])
這兩句就都是阻塞了,不需要異步
神清氣爽的趕腳

論壇徽章:
15
射手座
日期:2014-11-29 19:22:4915-16賽季CBA聯(lián)賽之青島
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16賽季CBA聯(lián)賽之四川
日期:2017-02-07 21:08:572015年亞冠紀(jì)念徽章
日期:2015-11-06 12:31:58每日論壇發(fā)貼之星
日期:2015-08-04 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-08-04 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-07-12 22:20:002015亞冠之浦和紅鉆
日期:2015-07-08 10:10:132015亞冠之大阪鋼巴
日期:2015-06-29 11:21:122015亞冠之廣州恒大
日期:2015-05-22 21:55:412015年亞洲杯之伊朗
日期:2015-04-10 16:28:25
20 [報告]
發(fā)表于 2016-08-18 12:09 |只看該作者
本帖最后由 yulihua49 于 2016-08-18 12:29 編輯
cokeboL 發(fā)表于 2016-08-18 11:38
go c2sCor()
go s2cCor()
這兩句就是啟動兩個協(xié)程,然后

啟動兩個協(xié)程,而不是線程?那么沒有并行功能,無法充分利用多核。
我希望看到多線程協(xié)程,能夠并行,也能把任務(wù)在多個線程間切換。要看看你是怎么管理協(xié)程與線程的關(guān)系。

少線程服務(wù)器  --- 其實還是多線程服務(wù)器,就是線程數(shù)不多,大約=核數(shù)。要充分利用所有的線程,一旦發(fā)生等待就yield,放棄這個任務(wù)趕緊接別的任務(wù)。

我那個例子只是應(yīng)用側(cè)代碼,很簡單,而且是同步異步自適應(yīng)的。就是:同步框架可以調(diào)用它,異步框架也可以調(diào)用它,只是需要事先提供yield函數(shù)即可。

多線程與多協(xié)程的關(guān)系在于yield函數(shù)內(nèi)的代碼,作為C,當(dāng)然是非常的龐雜,但是完全可以實現(xiàn)上述需求。

你是每個連接產(chǎn)生3個協(xié)程?如果10000個連接來了,就是30000個協(xié)程?30000個棧?每個棧就算1M,所需內(nèi)存?
在C里也是這個問題,我用棧池來解決,就是棧數(shù)=線程數(shù),激活的協(xié)程才擁有棧。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP