linux select 多线程编程,双向通信,线程阻塞

C++语言 码拜 5年前 (2016-05-02) 808次浏览
本人用select封装了一个socket_server和socket_client
在两个类有方法send,其本质就是一个queue,有send要求,往里面压
socket线程启动时,在while(true)里负责不断的判断fd_set可读可写状态,当可读,即读出数据,当可写时,即把queue里的数据一次一次的send出去。
–小小分割线–
其测试使用方法为:
test_server.cpp
Thread thread(socketclient);
thread.start();
socketclient.send();//send很多次,数据很多
test_server测试方法也一样
–分割线–
无论从哪一方大量发数据,另一方等待数据,都能正常接收
–再次分割–
当同时从双方大量发送数据时,程序莫名其妙的就会在test.cpp里不切到socket线程里去了,本人估计socket线程被阻塞了,但是跟着,也跟不到阻塞的地方,在封装的socket里,本人打了大量的log,read和write都没有阻塞,select也没有阻塞,实在想不通还有其他什么地方可以阻塞了。
求指导。
解决方案

20

引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

read和write都没有阻塞,这很好理解原因是你使用select,只有在读写条件满足时才会调用read或write
select有也没有阻塞,看你select函数设置,有超时设置吗,还是一直阻塞直到读或写条件满足
至于你为什么没有切换到你的socket线程,你看看你的队列能否为空无法发送或队列满了无法接收等情况

不好意思啊,是write阻塞了,刚测出来

你写一次之后,判断write的返回值n,即成功写入字节数,然后重新判断wfd能否可写

本人查了2天了,总算搞定了,谢谢啦,看来是本人对select的用法产生了误解,select的fd_set可读可写状态只能保证我们一次的可读可写状态,假如在一次判断的可读或可写状态里多次读或写,其本质上已经脱离select的范畴了。

恩,确实是,也帮助本人深入理解了


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明linux select 多线程编程,双向通信,线程阻塞
喜欢 (0)
[1034331897@qq.com]
分享 (0)