- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2010-07-05 14:54 编辑
Conn里的内容在创建线程的时候会被共用.比如你要创建两个线程,线程1里的Conn内容会被主线程改变.简单点说主 ...
samlumengjun 发表于 2010-07-05 13:45
感谢哦,找到了。修改如下:
子线程:
- static void * thread_work(void *param)
- {
- T_Connect Conn=*(T_Connect *)param;
- T_NetHead Head;
- int ret,logined=0;
- T_SRV_Var ctx;
- srvfunc *fp;
- int svcnum=0;
- #ifdef __GNUC__
- char gda[Conn.SendLen+1];//本线程的全局数据区必须在此分配。
- #else
- char *gda=alloca(Conn.SendLen+1);
- #endif
- if(Conn.SendLen>0) ctx.var=gda;
- else ctx.var=0;
- Conn.SendLen=0;
- ctx.tid=pthread_self();//标志多线程服务
- ctx.poolno=0;
- ___SQL_Init_SQL_Connect(&ctx.SQL_Connect);
- Conn.Var=&ctx;
- Conn.only_do=0;
- //借用only_do存放函数地址 conn_init
- if(((T_Connect *)param)->only_do) ((T_Connect *)param)->only_do(&Conn,&Head);
- ((T_Connect *)param)->Socket=-1;//通知主线程,param可以重用了。
复制代码 主线程:- ret=pthread_create(&pthread_id,&attr,thread_work,&Conn);
- if(ret) {
- ShowLog(1,"%s:pthread_create:%s",__FUNCTION__,strerror(ret));
- close(s);
- if(ret==EAGAIN||ret==ENOMEM) { //线程数用完了,休息一会,等一些线程退出
- sleep(30);
- }
- continue;
- }
- while(Conn.Socket != -1) usleep(1000);//等子线程通知。
复制代码 |
|