centos select() 函数运行不返回值

萌萌的卡洛奇 2014-11-14 02:50:22

显示的结果为:

每次到执行select函数后,就一直不返回值,然后程序貌似就停止了,后面的语句也不打印
希望有人能够解决我的问题,另外,我的操作系统是centos 6.4,用java调用C/C++代码,编译都已经通过了,动态链接库也生成了,中间没有报什么异常,但是调用就会出现问题
...全文
325 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
萌萌的卡洛奇 2014-11-25
  • 打赏
  • 举报
回复
问题最终解决了,是因为主线程过早结束导致子线程也随之死掉了,才会导致当子线程执行到select函数时出现了阻塞不返回的假象,谢谢楼上大大以及http://@zhxianbin童鞋对我的热心回答
zhxianbin 2014-11-21
  • 打赏
  • 举报
回复
线程中 使用 while(1) 没有问题,系统会调度其它线程运行的
萌萌的卡洛奇 2014-11-21
  • 打赏
  • 举报
回复
引用 11 楼 zhxianbin 的回复:
楼主怎么不出现了,赶快 用 select 做一个定时器测试看看是不是 centos select 有问题,我猜想能正常运行
现在确定了不是centos问题,单独测试select方法是可以实现定时的 问题的原因自己已经找出来了,是因为在一个主线程中开了一个用户登录的线程,而这个登陆线程中使用了select,所以当select进行时间阻塞的时候,这个线程就终止了,然后一直就不会运行这个线程了(具体原因我也不是很清楚),于是在开启这个登陆线程的同时加上了pthrea_join(),充分保证这个线程的执行完成之后再结束,然后就可以正常走下去了,但是现在问题又来了,在主程序中调用登录线程使用了一个while(1)所以这个登录线程一直都不会停止,然后一直就会出现不能执行登录之后的其他逻辑了,请问,能不能有什么办法解决这个问题
zhxianbin 2014-11-21
  • 打赏
  • 举报
回复
引用 16 楼 yuzhongzi81 的回复:
[quote=引用 15 楼 zhxianbin 的回复:] [quote=引用 14 楼 yuzhongzi81 的回复:] [quote=引用 13 楼 zhxianbin 的回复:] 线程中 使用 while(1) 没有问题,系统会调度其它线程运行的
可是调用了pthread_join是保证当前线程完成执行,没有执行完是会一直阻塞在那的,那么也就执行不了其他的逻辑了[/quote] pthread_join 阻塞的是调用线程,如果一个线程阻塞,另外的线程也不能执行,那多线程还有什么意义呢?![/quote] 是啊,我也很郁闷啊,它就是不跑啊 你帮我分析下代码吧 有一个这样的方法

//tdnlogin.cpp中的一个方法
bool CTdnLogin::StartLogin()
{
    ......
    m_LoginThread.StartThread(LoginThread, this);
    //如果我单独在这里创建线程,不加pthread_join也是可以跑的
    ......
}
......
//然后是ttxthread.cpp中StartThread(LoginThread,this)的实现
bool CTtxThread::StartThread(PFNThreadRun pfnCallback, void *pUsrData)
{
    //另外这个PFNThreadRun我不知道是个什么东西
    if (m_bRun)
    {
        return false;
    }
    m_pfnThreadRun = pfnCallback;
    m_pUsrData = pUsrData;
    m_bExit = false;
    int nRet = pthread_create(&m_thread, NULL, &ThreadFunc, this);
    if (0 == nRet)
    {
        pthread_join(m_thread, NULL);
        //这里就必须要加pthread_join了,不然跑都跑不了
        m_bRun = true;
        return true;
    }
    else
    {
        return false;
    }
}
//然后再回到tdnlogin.cpp中的loginThread方法
void* CTdnLogin::LoginThread(void *pUsrData){
    while(1){}
    //再这里面有一个死循环也就是这个线程会一直执行,然后就是StartLogin中的LoginThread后面的代码就不跑了,而是一直执
    //行死循环中的逻辑
}
[/quote] PFNThreadRun 就是 (void*)(*start_rtn)(void*) 这代码看不明白,简单的事情何必复杂化
萌萌的卡洛奇 2014-11-21
  • 打赏
  • 举报
回复
引用 15 楼 zhxianbin 的回复:
[quote=引用 14 楼 yuzhongzi81 的回复:] [quote=引用 13 楼 zhxianbin 的回复:] 线程中 使用 while(1) 没有问题,系统会调度其它线程运行的
可是调用了pthread_join是保证当前线程完成执行,没有执行完是会一直阻塞在那的,那么也就执行不了其他的逻辑了[/quote] pthread_join 阻塞的是调用线程,如果一个线程阻塞,另外的线程也不能执行,那多线程还有什么意义呢?![/quote] 是不是JNI的问题啊
萌萌的卡洛奇 2014-11-21
  • 打赏
  • 举报
回复
引用 15 楼 zhxianbin 的回复:
[quote=引用 14 楼 yuzhongzi81 的回复:] [quote=引用 13 楼 zhxianbin 的回复:] 线程中 使用 while(1) 没有问题,系统会调度其它线程运行的
可是调用了pthread_join是保证当前线程完成执行,没有执行完是会一直阻塞在那的,那么也就执行不了其他的逻辑了[/quote] pthread_join 阻塞的是调用线程,如果一个线程阻塞,另外的线程也不能执行,那多线程还有什么意义呢?![/quote] 是啊,我也很郁闷啊,它就是不跑啊 你帮我分析下代码吧 有一个这样的方法

//tdnlogin.cpp中的一个方法
bool CTdnLogin::StartLogin()
{
    ......
    m_LoginThread.StartThread(LoginThread, this);
    //如果我单独在这里创建线程,不加pthread_join也是可以跑的
    ......
}
......
//然后是ttxthread.cpp中StartThread(LoginThread,this)的实现
bool CTtxThread::StartThread(PFNThreadRun pfnCallback, void *pUsrData)
{
    //另外这个PFNThreadRun我不知道是个什么东西
    if (m_bRun)
    {
        return false;
    }
    m_pfnThreadRun = pfnCallback;
    m_pUsrData = pUsrData;
    m_bExit = false;
    int nRet = pthread_create(&m_thread, NULL, &ThreadFunc, this);
    if (0 == nRet)
    {
        pthread_join(m_thread, NULL);
        //这里就必须要加pthread_join了,不然跑都跑不了
        m_bRun = true;
        return true;
    }
    else
    {
        return false;
    }
}
//然后再回到tdnlogin.cpp中的loginThread方法
void* CTdnLogin::LoginThread(void *pUsrData){
    while(1){}
    //再这里面有一个死循环也就是这个线程会一直执行,然后就是StartLogin中的LoginThread后面的代码就不跑了,而是一直执
    //行死循环中的逻辑
}
zhxianbin 2014-11-21
  • 打赏
  • 举报
回复
引用 14 楼 yuzhongzi81 的回复:
[quote=引用 13 楼 zhxianbin 的回复:] 线程中 使用 while(1) 没有问题,系统会调度其它线程运行的
可是调用了pthread_join是保证当前线程完成执行,没有执行完是会一直阻塞在那的,那么也就执行不了其他的逻辑了[/quote] pthread_join 阻塞的是调用线程,如果一个线程阻塞,另外的线程也不能执行,那多线程还有什么意义呢?!
萌萌的卡洛奇 2014-11-21
  • 打赏
  • 举报
回复
引用 13 楼 zhxianbin 的回复:
线程中 使用 while(1) 没有问题,系统会调度其它线程运行的
可是调用了pthread_join是保证当前线程完成执行,没有执行完是会一直阻塞在那的,那么也就执行不了其他的逻辑了
mymtom 2014-11-20
  • 打赏
  • 举报
回复
关注,等待高手!
zhxianbin 2014-11-20
  • 打赏
  • 举报
回复
楼主怎么不出现了,赶快 用 select 做一个定时器测试看看是不是 centos select 有问题,我猜想能正常运行
zhxianbin 2014-11-19
  • 打赏
  • 举报
回复
你用 select 做一个定时器测试看看 http://www.cnblogs.com/jjdiaries/p/3404380.html
萌萌的卡洛奇 2014-11-15
  • 打赏
  • 举报
回复
引用 6 楼 zhxianbin 的回复:
select 就是阻塞的,描述符不变化的话,超时就会返回,可以通过返回值判断 http://zyg0227.blog.51cto.com/1043164/554208 http://www.cnblogs.com/faraway/archive/2009/03/06/1404449.html
现在的问题是select函数根本就不返回值,不管是连接超时还是连接不成功,我追踪到代码执行到这之后,就不往下执行了 select函数有平台差异性么,因为同样的一个C++库在android和IOS上都调用成功了,唯独我这边没通过
zhxianbin 2014-11-14
  • 打赏
  • 举报
回复
select 就是阻塞的,描述符不变化的话,超时就会返回,可以通过返回值判断 http://zyg0227.blog.51cto.com/1043164/554208 http://www.cnblogs.com/faraway/archive/2009/03/06/1404449.html
萌萌的卡洛奇 2014-11-14
  • 打赏
  • 举报
回复
引用 4 楼 erhou134 的回复:
int select ( int maxfd + 1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval * timeout); 注册的是 readset,放在writeset? 这是等accept吗
嗯,这个C++的库并不是我写的,我只是通过JNI在JAVA端调用这个C++库 你说的这个问题,我放在readset也是行不通的,也是一直卡在那儿,没有返回值,而且后面的打印语句也不打印了
空的 2014-11-14
  • 打赏
  • 举报
回复
int select ( int maxfd + 1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval * timeout); 注册的是 readset,放在writeset? 这是等accept吗
萌萌的卡洛奇 2014-11-14
  • 打赏
  • 举报
回复
引用 2 楼 erhou134 的回复:
socket noblock 了吗

嗯,设了的,在另一个方法中调用的
空的 2014-11-14
  • 打赏
  • 举报
回复
socket noblock 了吗
萌萌的卡洛奇 2014-11-14
  • 打赏
  • 举报
回复
图挡住了,重新截了一张

23,223

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧