acl/lib_acl/samples/thread/thread_pool2/main.c

102 lines
2.1 KiB
C

#include <getopt.h>
#include "lib_acl.h"
static char __addr[128];
static int __len = 1024;
static void thread_run(void *arg)
{
int i, n = *((int*) arg);
ACL_VSTREAM *client = acl_vstream_connect(__addr,
ACL_BLOCKING, 60, 60, 1024);
char *buf, *line;
int len;
printf("tid: %ld\r\n", (long) acl_pthread_self());
if (client == NULL) {
printf("connect %s error\r\n", __addr);
return;
}
buf = acl_mymalloc(__len + 3);
for (i = 0; i < __len; i++)
buf[i] = 'x';
buf[i] = '\r';
buf[i + 1] = '\n';
buf[i + 2] = 0;
len = strlen(buf);
line = acl_mymalloc(len + 1);
for (i = 0; i < n; i++) {
if (acl_vstream_writen(client, buf, strlen(buf)) == ACL_VSTREAM_EOF)
{
printf("write error\r\n");
break;
}
if (acl_vstream_gets(client, line, len + 1) == ACL_VSTREAM_EOF)
{
printf("gets error\r\n");
break;
}
if (n <= 100 || (i > 0 && i % 1000 == 0))
printf("tid: %ld, i: %d, n: %d\r\n",
(long) acl_pthread_self(), i, n);
}
acl_myfree(buf);
acl_myfree(line);
acl_vstream_close(client);
}
static void usage(const char *procname)
{
printf("usage: %s -h[help] -s addr[ip:port] -n nthreads -c count_per_thread -l line_length[1024]\r\n", procname);
}
int main(int argc, char **argv)
{
int ch, nthreads = 2, count = 100, i;
acl_pthread_pool_t *thrpool;
snprintf(__addr, sizeof(__addr), "127.0.0.1:5001");
while ((ch = getopt(argc, argv, "hs:n:c:l:")) > 0) {
switch (ch) {
case 'h':
usage(argv[0]);
return 0;
case 's':
snprintf(__addr, sizeof(__addr), "%s", optarg);
break;
case 'n':
nthreads = atoi(optarg);
if (nthreads <= 0)
nthreads = 2;
break;
case 'c':
count = atoi(optarg);
if (count <= 0)
count = 100;
break;
case 'l':
__len = atoi(optarg);
if (__len <= 0)
__len = 1024;
break;
default:
break;
}
}
thrpool = acl_thread_pool_create(nthreads, 120);
ACL_METER_TIME("----begin----");
for (i = 0; i < nthreads; i++)
acl_pthread_pool_add(thrpool, thread_run, &count);
acl_pthread_pool_destroy(thrpool);
ACL_METER_TIME("----end----");
return 0;
}