请教一下pthread

[复制链接]
查看11 | 回复6 | 2021-1-27 06:25:48 | 显示全部楼层 |阅读模式
pthread_create的第四的参数在传递时是老弄不明白,看到网上好多写法,但到我这就不好用了。
我有一个server程序,可以有多个client连接,每个连接一个子线程,但传参是老搞不明白,这是我的代码
typedefstructclient
{
intnewsd;
}SOCKET;
主线程:
SOCKET*sock;
sock=malloc(sizeof(SOCKET));
sock->newsd=accept(...);
printf("%d\n",sock->newsd);
ret=pthread_create(&tid,NULL,jobs,(void*)sock);
free(sock);
子线程:
void*jobs(void*arg)
{
SOCKET*sock;
sock=(SOCKET*)arg;
sd=sock->newsd;
printf("%d\n",sd);
}
这两个newsd打印出来不一样,本人新手,关于指针学的不太好,还望能指点一下,多谢了!!!
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:25:48 | 显示全部楼层
一样就怪了,一次accept是一个新的连接,fd都是不同的。
回复

使用道具 举报

千问 | 2021-1-27 06:25:48 | 显示全部楼层
引用1楼的回复:一样就怪了,一次accept是一个新的连接,fd都是不同的。
没来一个请求我才会accept的
回复

使用道具 举报

千问 | 2021-1-27 06:25:48 | 显示全部楼层
pthread_create(&tid,NULL,jobs,(void*)sock)
这个改成pthread_create(&tid,NULL,jobs,(void*)&sock)试一下吧...没道理不一样啊~~
回复

使用道具 举报

千问 | 2021-1-27 06:25:48 | 显示全部楼层

还存在一个问题,就是再pthread_create创建一个线程之后主线程不应该就free()阿,应该先pthread_join,然后再free()....因为不一定是子线程先运行阿,要是主线程先把sockfree掉的话那块空间就没了...
回复

使用道具 举报

千问 | 2021-1-27 06:25:48 | 显示全部楼层
我按4楼,5楼说的做了但还是不行啊,而且,如果我只传一个socket描述符可以,但这个描述符不能用,write函数在用时返回错误:badfiledescriptor
回复

使用道具 举报

千问 | 2021-1-27 06:25:48 | 显示全部楼层
你不是想传递intnewsd;么?直接写
intnewsd=accept(...);
printf("%d\n",newsd);
ret=pthread_create(&tid,NULL,jobs,(void*)newsd);
子线程:
void*jobs(void*arg)
{
intsd=(int)newsd;
printf("%d\n",sd);
}
就行了
如果编译提示void*到int损失精度,可以改为intsd=(unsignedlong)newsd;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行