-
Notifications
You must be signed in to change notification settings - Fork 759
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
tcp读取数据的时候,断开后一段时间后出现死锁 #302
Comments
已收到您的邮件,如有问题会尽快给您回复.
|
连接的时候使用如下的非阻塞方式,不确定对libgo 有没有影响 //非阻塞方式连接
int error=-1, len;
len = sizeof(int);
struct timeval tm;
fd_set set;
unsigned long ul = 1;
ioctl(sockfd, FIONBIO, &ul); //设置为非阻塞模式
if( connect(sockfd,(struct sockaddr *)&plcaddr,sizeof(plcaddr)) == -1)
{
tm={out_time,0};//10s
//tm.tv_set = TIME_OUT_TIME;
//tm.tv_uset = 0;
FD_ZERO(&set);
FD_SET(sockfd, &set);
if(select(sockfd+1, NULL, &set, NULL, &tm) > 0)
{
getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len);
if(error == 0)
ret = true;
else
ret = false;
}
else
ret = false;
}
else
ret = true;
ul = 0;
ioctl(sockfd, FIONBIO, &ul); //设置为阻塞模式 |
@qinrhx 这个协程调用函数有锁,协程外也对这个锁也有处理,容易锁. 我这里只是用了tcp非阻塞遇到问题,改成阻塞貌似还正常. |
@qinrhx 多谢,等有时间我试试,不好复现 |
我也遇到了这个问题,难受的一逼莫名奇妙死锁了。你用的是哪个版本 |
@SignalEmit 具体哪个版本不记得了,是之前从master下载的,你找master提交记录更换锁套件之前的试试吧,比如这个 |
|
哦,这我倒没测过,我没有在协程里做循环休眠的。 |
我这两天仔细看了一下这个代码,发现这个锁加的不太好,巨大的区域锁(有空了代码仔细看明白了,我重构重构这个锁)。上面那个tcp模块的死锁我找到原因了 测试出了两处死锁 死锁1: 线程1 线程2 我仔细看了一下代码waitQueue_.LockRef()这个锁不好改,这个锁不仅锁携程调度队列,还要task,改了会导致压入的数据校验的时候,多线程会置空。我得做法是屏蔽掉 routine_sync/timer.h run函数 timer.h 128行 std::unique_lock invoke_lock(*invoke_mtx); 写了个http并发示例测试了半个小时暂时没发现有异常。代码没细细研究,暂时不清楚拆了这块会导致什么异常问题。暂时看没发现有崩溃情况。 死锁2: 我得处理办法是 TSQueue size计数换成原子计数 |
1 similar comment
我这两天仔细看了一下这个代码,发现这个锁加的不太好,巨大的区域锁(有空了代码仔细看明白了,我重构重构这个锁)。上面那个tcp模块的死锁我找到原因了 测试出了两处死锁 死锁1: 线程1 线程2 我仔细看了一下代码waitQueue_.LockRef()这个锁不好改,这个锁不仅锁携程调度队列,还要task,改了会导致压入的数据校验的时候,多线程会置空。我得做法是屏蔽掉 routine_sync/timer.h run函数 timer.h 128行 std::unique_lock invoke_lock(*invoke_mtx); 写了个http并发示例测试了半个小时暂时没发现有异常。代码没细细研究,暂时不清楚拆了这块会导致什么异常问题。暂时看没发现有崩溃情况。 死锁2: 我得处理办法是 TSQueue size计数换成原子计数 |
现在这个库不怎么维护了是大问题,都不敢用了 |
centos7.8 gcc 10
场景很常见,目前一个设备,大约每秒1次执行下协程读取网口状态, 开始网络正常,然后断开设备网络,几个小时甚至更多就出现死锁,如下下数据 @yyzybb537 这个锁是libgo内部的吧
死锁情况
The text was updated successfully, but these errors were encountered: