int main(int argc, int argv) { char *args[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30"}; thread_pool_t *thread_pool = thread_pool_init(1, 2); int i = 0, tag, value; for (i = 0; i < 30; i++) { do { tag = thread_pool_add_job(thread_pool, work, args[i]); if (tag == 1) { value = thread_pool_resize(thread_pool, thread_pool->thread_num * 2, thread_pool->queue_max_num * 2); if (value == -1) { printf("参数错误!\n"); exit(-1); } else if (value == -2) { printf("申请内存错误!\n"); exit(-1); } else if (value == -3) { printf("线程创建错误!\n"); exit(-1); } } }while (tag != 0); } sleep(2); thread_pool_destroy(thread_pool); return 0; }
// 服务器等待连接函数 bool xyftp_accept_client() { int listen_fd; int accept_fd; struct sockaddr_in server_addr; struct sockaddr_in client_addr; if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { xyftp_print_info(LOG_ERR, "Create Socket Error, What The F**k !?"); return false; } int optval = 1; if (setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, (void *)&optval, sizeof(int)) < 0) { xyftp_print_info(LOG_ERR, "Set Socket SO_REUSEADDR Error!"); return false; } bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(config_global.ftp_port); server_addr.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { xyftp_print_info(LOG_ERR, "Bind Scoket Error!"); return false; } if (listen(listen_fd, LISTEN_SIZE) < 0) { xyftp_print_info(LOG_ERR, "Listen Socket Error!"); return false; } socklen_t client_addr_len = sizeof(client_addr); while (true) { bzero(&client_addr, sizeof(client_addr)); accept_fd = accept(listen_fd, (struct sockaddr *)&client_addr, &client_addr_len); if (accept_fd < 0) { xyftp_print_info(LOG_ERR, "Accept Socket Error!"); return false; } char info_buf[100]; sprintf(info_buf, "New Connection Create. Client IP : %s", inet_ntoa(client_addr.sin_addr)); xyftp_print_info(LOG_INFO, info_buf); // 传值,注意在线程函数内部读取参数值,而非解引用 int tag, thread_pool_want; do { // 非阻塞模式调用线程池接口 tag = thread_pool_add_job(thread_pool_global, xyftp_thread_job_entry, (void *)accept_fd, 0); if (tag == 1) { thread_pool_want = thread_pool_global->thread_num + config_global.thread_pool_add_size; if (thread_pool_want <= config_global.max_clients) { if (thread_pool_resize(thread_pool_global, thread_pool_want, thread_pool_want) != 0) { xyftp_print_info(LOG_ERR, "Thread Pool Resize Error!"); break; } xyftp_print_info(LOG_INFO, "Thread Pool Resized Succeed!"); } else { xyftp_print_info(LOG_ERR, "Too Many Client!"); close(accept_fd); break; } } else if (tag == -1) { xyftp_print_info(LOG_ERR, "Add Thread Pool Job Error!"); return false; } } while (tag != 0); } }