如何正确的给新创建的线程传递参数

问题背景描述:
假设有一个服务端程序,主线程用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值