当前位置: 技术问答>linux和unix
并发服务器(tcp和udp)
来源: 互联网 发布时间:2016-11-10
本文导语: TCP:主线程accept,返回值保存在临时socket中,tmpSocket = accept(lSocket,&cSocket,&cSocketLen)。支线程执行具体客户的请求。 疑问:主线程中的tmpSocket会在循环中被快速的覆盖掉,所以支线程的第一条代码就是复制tmpSocket...
TCP:主线程accept,返回值保存在临时socket中,tmpSocket = accept(lSocket,&cSocket,&cSocketLen)。支线程执行具体客户的请求。
疑问:主线程中的tmpSocket会在循环中被快速的覆盖掉,所以支线程的第一条代码就是复制tmpSocket的值,从而支线程能正常运行。但是我觉得如果支线程的复制执行慢了一点点,主线程还是会把tmpSocket覆盖掉。请问我这个担忧是否多虑了?有没有更好的解决方案?
UDP:主线程recvfrom,支线程复制获得的socket处理客户信息。
疑问:这种方法我也比较担心(同上),请大家帮我参考下。还有两个UDP方案我不太懂,烦劳大家指点一下:1.selcet 2.一个接受线程+缓冲队列+多个处理线程(为什么需要缓冲队列,udp自己就有一个缓冲,何苦要自己去维护呢?)
疑问:主线程中的tmpSocket会在循环中被快速的覆盖掉,所以支线程的第一条代码就是复制tmpSocket的值,从而支线程能正常运行。但是我觉得如果支线程的复制执行慢了一点点,主线程还是会把tmpSocket覆盖掉。请问我这个担忧是否多虑了?有没有更好的解决方案?
UDP:主线程recvfrom,支线程复制获得的socket处理客户信息。
疑问:这种方法我也比较担心(同上),请大家帮我参考下。还有两个UDP方案我不太懂,烦劳大家指点一下:1.selcet 2.一个接受线程+缓冲队列+多个处理线程(为什么需要缓冲队列,udp自己就有一个缓冲,何苦要自己去维护呢?)
|
while (SOCKET s = accept()) //比如这里s的值为4000,即s是个值为4000的socket
createThread(NULL, 0, proc, (void *)s); //这里是把4000做为一个指针地址传给线程了
//对于32位系统,实际上就是在新创建的线程的栈里放了入了4个字节长度的数字4000
UINT proc(void * param)
{
//这里的param是从栈中取得的值,还是4000,至于地址4000指向的内容是什么,不关心它,也不能使用
SOCKET s = (SOCKET)param; //把4000的赋值给s,于是得到了一个值为4000的socket
//后面即可像主线程一样的对s操作
}
//当createthread执行完后,4000的值已经在线程的的栈上了
//再给s赋值,已经不影响线程的执行了
while (SOCKET s = accept())
createThread(NULL, 0, proc, (void *)s);
关于SOCKET s的定义我是懒省事才写成那样,写到哪都行的,当前讨论的问题都没有关系
createThread(NULL, 0, proc, (void *)s); //这里是把4000做为一个指针地址传给线程了
//对于32位系统,实际上就是在新创建的线程的栈里放了入了4个字节长度的数字4000
UINT proc(void * param)
{
//这里的param是从栈中取得的值,还是4000,至于地址4000指向的内容是什么,不关心它,也不能使用
SOCKET s = (SOCKET)param; //把4000的赋值给s,于是得到了一个值为4000的socket
//后面即可像主线程一样的对s操作
}
//当createthread执行完后,4000的值已经在线程的的栈上了
//再给s赋值,已经不影响线程的执行了
while (SOCKET s = accept())
createThread(NULL, 0, proc, (void *)s);
关于SOCKET s的定义我是懒省事才写成那样,写到哪都行的,当前讨论的问题都没有关系
|
如果是自定义的类型的话,就直接传地址了,每次都生成新的内存地址
struct MyStruct
{
...
};
UINT proc(void * param)
{
MyStruct * p = (MyStruct*)param;
....
delete p; //当然,内存的释放可以用其它的办法,比如用消息等方式通知主线程回收资源
}
UINT lnstProc(void * param)
{
while (SOCKET s = accept())
{
MyStruct * p = new MyStruct;
//....
createThread(NULL, 0, proc, (void *)p);
}
}
|
关于tmpSocket的问题,是楼主多虑了
看下面的测试代码
看下面的测试代码
[root@wwapp tmp]# cat tfork.cpp
#include
#include
#include
#include
using namespace std;
int main()
{
int tmp = 0;
for (int i = 0; i