Пример #1
0
int main(int argc, char *argv[])
{
    cp_cntx_t *ctx;
    int idx, thd_num;

    if (4 != argc) {
        fprintf(stderr, "Paramter isn't right!\n");
        return -1;
    }

    //nice(-20);

    thd_num = atoi(argv[3]);
    if (thd_num <= 0) {
        thd_num = CP_THD_NUM;
    }

    /* > 初始化处理 */
    ctx = (cp_cntx_t *)calloc(1, sizeof(cp_cntx_t));
    if (NULL == ctx) {
        fprintf(stderr, "%s:[%d] errmsg:[%d] %s!\n", __FILE__, __LINE__, errno, strerror(errno));
        return -1;
    }

    snprintf(ctx->src, sizeof(ctx->src), "%s", argv[1]);
    snprintf(ctx->dst, sizeof(ctx->dst), "%s", argv[2]);

    if (stat(ctx->src, &ctx->fst)) {
        fprintf(stderr, "%s:[%d] errmsg:[%d] %s!\n", __FILE__, __LINE__, errno, strerror(errno));
        return -1;
    }

    /* > 创建线程池 */
    ctx->tpool = thread_pool_init(thd_num, NULL, NULL);
    if (NULL == ctx->tpool) {
        fprintf(stderr, "%s:[%d] errmsg:[%d] %s!\n", __FILE__, __LINE__, errno, strerror(errno));
        return -1;
    }

    /* > 执行拷贝处理 */
    for (idx=0; idx<thd_num; ++idx) {
        thread_pool_add_worker(ctx->tpool, cp_copy_routine, ctx);
    }

    while (1) { pause(); }

    return 0;
}
Пример #2
0
int main(int argc, char *argv[])
{
	thread_pool_handle *handle;
	int i;

	handle = thread_pool_init(10);
	if(!handle){
		printf("thread_pool_init error!\n");
		return -1;
	}

	sleep(3);
	for(i=0;i<10;i++){
		thread_pool_add_worker(handle, try_printf, &i);
		sleep(1);
	}

	sleep(10);
	thread_pool_exit(handle);
}
Пример #3
0
/*
 * 侦听端口及处理请求
 */
int SelectAndHandle( int listensockfd, int listenunixfd )
{
    unsigned long    addrsize;
    fd_set           rset,allset;
    int              connectfd,maxfd=listensockfd>listenunixfd?listensockfd:listenunixfd;
    int              i,n;
    uid_t            uid;
    int              nready;
    struct sockaddr  cliaddr;
    char             recvbuf[SIZERCV+1];
    char             *p;

    CLIENT           client[FDSIZE];

    addrsize = sizeof( struct sockaddr );
    FD_ZERO( &allset );
    FD_SET( listensockfd, &allset );
    FD_SET( listenunixfd, &allset );
    for( i=0; i<FDSIZE; i++ )
    {
        client[i].fd = -1;
        client[i].i  = i;
    }

    printf("%sSelectAndHandle\n", AT);
    /* 初始化线程池 */
    thread_pool_t *pool = NULL;
    if( thread_pool_init(&pool, POOLSIZE) < 0 )
    {
        err_sys( "thread pool init error" );
    }

    n=1;
    while (1)
    {
        rset = allset;
        /* 接受新连接 */
        if (( nready = select( maxfd + 1, &rset, NULL, NULL, NULL ) ) < 0 )
        {
            fprintf(stderr,"%sselect err %d %s",AT, nready, strerror(errno) );
            continue;
        }

        if (FD_ISSET( listensockfd, &rset ))
        {
            if (( connectfd = accept( listensockfd, &cliaddr, ( socklen_t *)&addrsize ) ) == -1 )
            {
                fprintf(stderr, "%saccept err", AT );
                sleep(1);
                continue;
            }

SOCKAGAIN:
            for( i = 0; i<FDSIZE; i++ )
            {
                if( client[i].fd < 0 )
                {
                    client[i].fd   = connectfd;
                    client[i].type = SOCK;
                    client[i].addr = cliaddr;
                    client[i].n = n;
                    thread_pool_add_worker(pool, ( FUNC )HandleInSide, &(client[i]) );
                    n++;
                    break;
                }
            }
            if (i==FDSIZE)
            {
                /* 线程池已满 */
                fprintf(stderr,"%s,pool is full\n", AT);
                sleep(1);
                goto SOCKAGAIN;
            }
            if ( --nready <= 0 )
                continue;
        }
        if( FD_ISSET( listenunixfd, &rset ) )
        {
#if defined(Darwin)
            if (( connectfd = serv_accept( listenunixfd, NULL ) ) < 0 )
#else
            if (( connectfd = serv_accept( listenunixfd, &uid ) ) < 0 )
#endif
            {
                fprintf(stderr, "%sserv_accept err %d %s\n", AT, connectfd, strerror(errno) );
                sleep(1);
                continue;
            }
UNIXAGAIN:
            for( i = 0; i<FDSIZE; i++ )
            {
                if( client[i].fd < 0 )
                {
                    client[i].fd   = connectfd;
#if !defined(Darwin)
                    client[i].uid  = uid;
#endif
                    client[i].type = SOCK;
                    thread_pool_add_worker(pool, ( FUNC )HandleOutSide, &(client[i]) );
                    n++;
                    break;
                }
            }
            if (i==FDSIZE)
            {
                fprintf(stderr,"%s,pool is full\n", AT);
                sleep(1);
                goto UNIXAGAIN;
            }
            if ( --nready <= 0 )
                continue;

        }
    }
    thread_pool_destroy(pool);
    pool = NULL;
    return EXIT_SUCCESS;
}