• 4390阅读
  • 9回复

关于线程假死现象 [复制链接]

上一主题 下一主题
离线soulfy
 

只看楼主 倒序阅读 楼主  发表于: 2013-07-26
线程向一个队列中插入数据
同步使用了QMutex。


一个线程占上锁之后,没有在得到运行,导致剩下的线程全挂这里了。


是因为线程开太多么,程序运行时一共不到20个线程。
其中有一个线程中用到
while(1)
{
    。。。
    msleep(0);
}
会跟这个有关系么?
离线ppdayz

只看该作者 1楼 发表于: 2013-07-26
你自己改了测试一下
离线realfan

只看该作者 2楼 发表于: 2013-07-26
一个线程lock后,没unlock,其它线程再想lock时,当然就挂住了。
离线soulfy

只看该作者 3楼 发表于: 2013-07-26
回 1楼(ppdayz) 的帖子
给个建议不?是线程给临界区加锁后得不到执行了,怎么该这个调度?
离线realfan

只看该作者 4楼 发表于: 2013-07-26
回 3楼(soulfy) 的帖子
不知道你的while(1)里面做些什么事,
原则是
需要写队列时,再上锁。写完立刻放。
尽量减少锁定时间。

这样,其它线程也可有机会写队列。
离线jdwx

只看该作者 5楼 发表于: 2013-07-26
加锁和解锁要配对,要检查是不是在所有的情况下都能配对使用。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线cycloneii

只看该作者 6楼 发表于: 2013-07-26
有可能是msleep导致了整个进程而不是单个的线程休眠了。
在很多OS上,msleep、sleep是进程休眠而不是线程休眠
离线XChinux

只看该作者 7楼 发表于: 2013-07-26
使用QEventLoop来代替msleep()吧。
还有循环,如果可以的话,使用QTimer的timeout()来代替。不要阻塞事件循环。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线soulfy

只看该作者 8楼 发表于: 2013-07-26
感谢几位的回答,不过这些我都注意到了,我程序里锁的使用是正确的,目前我觉得六楼得说法是有可能得。
离线realfan

只看该作者 9楼 发表于: 2013-07-29
回 8楼(soulfy) 的帖子
也不至于全挂。
能否把while(1)里的代码帖上来看看。
你是在哪上锁,在哪解锁的。如果是while(1)之前上锁,在while(1)外解锁,在while(1)期间,其它线程肯定是挂住了。
快速回复
限100 字节
 
上一个 下一个