问题背景描述:
假设有一个服务端程序,主线程用epoll来监控socket通信,如下:
int mian()
{
bind(listen_fd,.........);
//代码段省略
while(1)
{
trigger_num = epoll_wait(epoll_fd, events, MAX_EVENT, 500);
for(int i = 0; i < trigger_num; i++)
{
if(events[i].data.fd == listen_fd)
{
//有新连接到来
accept新连接
新连接socket设置未非阻塞
新连接socket加入到epoll
}
else
{
//接收到旧连接数据
int read_num = recv(events[i].data.fd,......);
if(read_num > 0)
{//处理数据
//**假设收到第一个字符为‘a’,则创建一个新的线程,并把当前socketfd传递到新线程中**
if('a' == buf[0])
{
pthread_t pId;
pthread_create(&pId,NULL,thread_proc,**/* 该参数如何传递比较好*/**);
}
}
}
}
}
}
关于传递多个参数,一种比较通用的方式是为pthread_create做一次函数包装,由包装函数完成一些琐碎的事情,下面举例说明扩展成3个参数的例子,之后调用my_thread_create()即可处理多于一个参数的例子。
typedef void * (*FUNCALLBACK)(void * arg1, void * arg2, void * arg3);
typedef stuct {
FUNCALLBACK callback;
void * arg1;
void * arg2;
void * arg3;
} ARGS;
void * sub_thread_entry(void * arg)
{
ARGS args;
/* retrieve args */
args.callback = ((ARGS *)arg)->callback;
args.arg1 = ((ARGS *)arg)->arg1;
args.arg2 = ((ARGS *)arg)->arg2;
args.arg3 = ((ARGS *)arg)->arg3;
free(arg);
return args.callback(args.arg1, args.arg2, args.arg3);
}
int my_pthread_create(pthread_t *thread, const pthread_attr_t *attr,
FUNCALLBACK start_routine, void *arg1, void * arg2, void * arg3)
{
ARGS * args;
if (NULL == (args=(ARGS *)malloc(sizeof(ARGS))))
return -1;
/* push args into buffer */
args->callback = start_routine;
args->arg1 = arg1;
args->arg2 = arg2;
args->arg3 = arg3;
return pthread_create(pthread, attr, sub_thread_entry, args);
}
参照:
https://blog.csdn.net/jisuanji_wjfioj/article/details/39048317