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

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 2235 | 回復(fù): 4
打印 上一主題 下一主題

[C++] 網(wǎng)絡(luò)編程線程池問(wèn)題 [復(fù)制鏈接]

論壇徽章:
1
2015亞冠之浦和紅鉆
日期:2015-05-26 14:37:09
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2015-06-28 15:26 |只看該作者 |倒序?yàn)g覽
[code]/* include serv08 */
#include "unpthread.h"
#include "pthread08.h"

static int nthreads;
pthread_mutex_t clifd_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t clifd_cond = PTHREAD_COND_INITIALIZER;

int
main(int argc, char **argv)
{
    int i, listenfd, connfd;
    void sig_int(int), thread_make(int);
    socklen_t addrlen, clilen;
    struct sockaddr *cliaddr;

    if (argc == 3)
        listenfd = Tcp_listen(NULL, argv[1], &addrlen);
    else if (argc == 4)
        listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
    else
        err_quit("usage: serv08 [ ] <#threads>");
    cliaddr = Malloc(addrlen);

    nthreads = atoi(argv[argc-1]);

    tptr = Calloc(nthreads, sizeof(Thread));

    iget = iput = 0;

        /* 4create all the threads */
    for (i = 0; i < nthreads; i++)
        thread_make(i); /* only main thread returns */

    Signal(SIGINT, sig_int);

    for ( ; ; ) {
        clilen = addrlen;
        connfd = Accept(listenfd, cliaddr, &clilen);

        Pthread_mutex_lock(&clifd_mutex);
        clifd[iput] = connfd;
        if (++iput == MAXNCLI)
            iput = 0;
        if (iput == iget)
            err_quit("iput = iget = %d", iput);
        Pthread_cond_signal(&clifd_cond);
        Pthread_mutex_unlock(&clifd_mutex);
    }
}






最近看unp27章中的服務(wù)器模型部分,27.12節(jié)是并發(fā)服務(wù)器程序,主線程統(tǒng)一accept
也就是主線程accept,worker線程工作那么模式。作者處理消費(fèi)者和生產(chǎn)者問(wèn)題的時(shí)候,使用了條件變量和互斥量達(dá)到同步。但是我覺(jué)得有些問(wèn)題
作者在考慮循環(huán)隊(duì)列的問(wèn)題上,是采用如此的策略,在生產(chǎn)者函數(shù)中,如果iput==iget,必然是數(shù)組緩沖區(qū)滿,作者直接采用的是、
if (iput == iget)
             err_quit("iput = iget = %d", iput);

也就是說(shuō)如果生產(chǎn)者的速度,大于消費(fèi)者的話,我們的主線程只能結(jié)束。。這個(gè)是不是有待商榷??對(duì)應(yīng)的情況就是,如果多個(gè)客戶連接連續(xù)產(chǎn)生,工作子線程來(lái)不及處理的時(shí)候,我們的主線程就自己err_quit了。。
有沒(méi)有更好的辦法?(在只采用一個(gè)條件變量的條件下)









論壇徽章:
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è)計(jì)版塊每日發(fā)帖之星
日期:2015-08-04 06:20:00程序設(shè)計(jì)版塊每日發(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
2 [報(bào)告]
發(fā)表于 2015-06-28 19:44 |只看該作者
本帖最后由 yulihua49 于 2015-06-28 19:53 編輯
kkshaq 發(fā)表于 2015-06-28 15:26
[code]/* include serv08 */
#include "unpthread.h"
#include "pthread08.h"

根本不能這么玩。
純粹是個(gè)學(xué)生作業(yè),沒(méi)有實(shí)用價(jià)值。

主線程接受連接,然后丟給epoll。線程池在epoll_wait。
接受的連接數(shù)可大大超過(guò)線程數(shù)。他們?cè)趀poll排隊(duì)。

論壇徽章:
1
2015亞冠之浦和紅鉆
日期:2015-05-26 14:37:09
3 [報(bào)告]
發(fā)表于 2015-06-28 21:20 |只看該作者
yulihua49 發(fā)表于 2015-06-28 19:44
根本不能這么玩。
純粹是個(gè)學(xué)生作業(yè),沒(méi)有實(shí)用價(jià)值。

線程池這個(gè)模型還是可以探討一下啊

消費(fèi)者和生產(chǎn)者之間同步的問(wèn)題。。為什么作者不使用真正的共享緩沖區(qū)同步呢。讓程序可以一直運(yùn)行下去。。不然像作者這樣,共享緩沖區(qū)滿了,主線程就得退出啊。
不知道是不是我錯(cuò)了,你覺(jué)得呢??

論壇徽章:
1
射手座
日期:2014-08-04 16:49:43
4 [報(bào)告]
發(fā)表于 2015-06-29 09:37 |只看該作者
文章只是告訴你 線程池實(shí)現(xiàn)的簡(jiǎn)單方式, 如果考慮那么全, 那么多代碼 怎么教學(xué)生啊,,要考慮篇幅。

論壇徽章:
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è)計(jì)版塊每日發(fā)帖之星
日期:2015-08-04 06:20:00程序設(shè)計(jì)版塊每日發(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
5 [報(bào)告]
發(fā)表于 2015-06-29 09:44 |只看該作者
本帖最后由 yulihua49 于 2015-06-29 09:52 編輯
kkshaq 發(fā)表于 2015-06-28 21:20
線程池這個(gè)模型還是可以探討一下啊

消費(fèi)者和生產(chǎn)者之間同步的問(wèn)題。。為什么作者不使用真正的共享緩沖 ...

一般是采用context做緩沖區(qū),是每個(gè)連接獨(dú)享的。
采用epoll作為事件隊(duì)列。
凡是接入的連接,一律加到epoll隊(duì)列,隨后的IO事件都是由epoll處理?梢杂卸鄠(gè)線程。
epoll隊(duì)列完成了生產(chǎn)者-消費(fèi)者模型。
epoll之后的線程數(shù),與核數(shù)有關(guān),而與連接數(shù)無(wú)關(guān)。連接數(shù)與系統(tǒng)的fd數(shù)和應(yīng)用的context數(shù)有關(guān)。
連接數(shù)超過(guò)線程數(shù)也沒(méi)關(guān)系,在epoll里等就是了。只有它發(fā)生IO時(shí)才需要線程。
如果發(fā)生IO的連接數(shù)超過(guò)了線程數(shù),也沒(méi)關(guān)系,等就是了。等到有線程完成了其他任務(wù)回來(lái)抓事件。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP