怎么办才能实现多线程通信,不会因为accept而阻塞整个程序

怎么办才能实现多线程通信,不会因为accept而阻塞整个程序,第1张

你自己想想,创建一个新的线程就行了吧。自己想出来的才有成就感,印象最深

追问: 我用while循环就是每次创建一个新的线程的,可是创建成功后就会进入下一循环,accept等待下一个连接而阻塞程序。 回答: 不是的,你第一个线程就是等待accept,新创建的线程就是监听创建的socket了,线程之间不会阻塞的。 追问: 线程不会阻塞我知道,我的第一个连接成功后,创建了一个线程,他去一边和用户一通信去了,开始第二层循环,accept等待用户二到来,用户二到来就会创建第一个线程去一边执行去了。但是如果用户二不来,accept一直等待不到而阻塞整个进程,先前为用户一创建的线程算然可以用,但是整个进程阻塞了,它就是联通也没法用?不知怎么解决? 回答: 不是啊,用户二来不来跟用户一通信没关系的。一个线程不会阻塞别的线程的。更没有整个进程阻塞的说法。 追问: 我知道你为什么这么误解了,线程创建成功后会立即返回,它不会等待这个线程结束才返回,一旦创建成功就会进入while的下一个循环再次accept而阻塞。 回答: 那是你的误解,线程之间不会阻塞的。一个线程不会阻塞进程。进程不是cpu调度的单元,根本没有阻塞之说。信我的就行了。 追问: 我无语了,我是说是accept函数阻塞进程。不是线程。 回答: accept只能阻塞线程,不能阻塞进程。

用浅显的话来说吧。

在一般的情况下,在系统和应用程序之间有一个请求队列层,起到调度的作用,应用程序不会直接访问系统,而是把访问请求放进队列层中;而系统也在不停的从队列层中提取请求然后不断的分发执行,这种请求方式就是阻塞式访问。

但是有些特殊的请求是不允许停止和等待的,这种请求就不会被放入队列层中,而是直接插入到系统的当前处理的前端,而被优先执行,这种请求方式就是非阻塞式访问。

这二者的区别是由于其工作性质决定的,单纯从理论角度来说,与CPU占用等没有任何关系,CPU占用只和和算法复杂度有关。

一般非阻塞功能都是使用在系统级的请求上,比如某些驱动级的中断请求或实时类请求,因为绕过了请求队列,编制不良的非阻塞程序可能会导致系统失去响应。

1首先将标志位设为Non-blocking模式,准备在非阻塞模式下调用connect函数

2调用connect,正常情况下,因为TCP三次握手需要一些时间;而非阻塞调用只要不能立即完成就会返回错误,所以这里会返回EINPROGRESS,表示在建立连接但还没有完成。

3在读套接口描述符集(fd_set rset)和写套接口描述符集(fd_set

wset)中将当前套接口置位(用FD_ZERO()、FD_SET()宏),并设置好超时时间(struct

timeval timeout)

4调用select( socket, &rset, &wset, NULL, timeout )

返回0表示connect超时

如果你设置的超时时间大于75秒就没有必要这样做了,因为内核中对connect有超时限制就是75秒。

网络编程中socket的分量我想大家都很清楚了,socket也就是套接口,在套接口编程中,提到超时的概念,我们一下子就能想到3个:发送超时,接收超时,以及select超时(注:

select函数并不是只用于套接口的,但是套接口编程中用的比较多),在connect到目标主机的时候,这个超时是不由我们来设置的。不过正常情况下这个超时都很长,并且connect又是一个阻塞方法,一个主机不能连接,等着connect返回还能忍受,你的程序要是要试图连接多个主机,恐怕遇到多个不能连接的主机的时候,会塞得你受不了的。我也废话少说,先说说我的方法,如果你觉得你已掌握这种方法,你就不用再看下去了,如果你还不了解,我愿意与你分享。本文是已在Linux下的程序为例子,不过拿到Windows中方法也是一样,无非是换几个函数名字罢了。

Linux中要给connect设置超时,应该是有两种方法的。一种是该系统的一些参数,这个方法我不讲,因为我讲不清楚:P,它也不是编程实现的。另外一种方法就是变相的实现connect的超时,我要讲的就是这个方法,原理上是这样的:

1.建立socket

2.将该socket设置为非阻塞模式

3.调用connect()

4.使用select()检查该socket描述符是否可写(注意,是可写)

5.根据select()返回的结果判断connect()结果

6.将socket设置为阻塞模式(如果你的程序不需要用阻塞模式的,这步就省了,不过一般情况下都是用阻塞模式的,这样也容易管理)

数字电视中信源交换机出现阻塞现象:这个你可以逐步排除判断:连续PING网关,如19216801,然后挨个插拔交换机的级连口,等拔到那个通那个交换机就有问题。也有可能是这个交换机上连接的电脑中病毒引起。你也可以通过其他软件做检测,看看是硬件还是其他的原因

g8风扇狂转自动关机迅速是因为电脑系统中毒或中了恶意软件、cpu 风扇坏 cpu 温度过高,过热保护、电源坏,或添加了新硬件,电源供电不足、 显卡或显卡风扇坏、主板坏,主板芯过热等情况电脑都会自动关机。

自动关机故障排除方法:

1、有可能是BIOS的设置问题,进入BIOS里恢复默认设置或把主板的电池拿出来,反扣放电,等5分钟在反装进去即可。目的:是BIOS的设置恢复默认值,排除BIOS的散热预设自动重启或关机现象。

2、如果电脑在使用某一个应用程序软件时发生自动关机,则自动关机故障可能是由此程序软件引起的,一般将程序软件卸载即可。

3、接着检查电源,电源品质差,老化或功率过小,无法满足电脑各配件的供电需求,可更换大功率高质量的电源,如果故障排除,则是电源引起的自动关机故障。!!

您表述得不太清楚我就按照我所理解的回答。比如你在windows里开了一个程序,程序d出来后点击后没有反应,系统提示该程序无响应,是否强制结束。这个时候选择等待响应是会恢复的,这个是你说的从阻塞到运行,也有无法恢复的可能。就绪到阻塞,我的理解是,你点了某个程序后明显感觉系统做出了响应,比如屏幕闪了一下,但是之后程序还是没有d出来。做出响应就是就绪了,程序没有运行就是阻塞,这种情况可能和兼容性有关。

如果答得不对,你可以把问题再说得具体些

#include<windowsh>

int main()

{

STARTUPINFO si; //进程启动时需要初始化的结构

PROCESS_INFORMATION pi; //进程启动后的有关信息

sicb = sizeof(STARTUPINFO);

GetStartupInfo(&si);

siwShowWindow = SW_SHOW; //这里设置窗口为显示,SW_HIDE为隐藏窗口

sidwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;

CreateProcess("C:\\Program Files\\Internet Explorer\\IEXPLOREEXE",

NULL,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi);

return 0;

}

以上就是关于怎么办才能实现多线程通信,不会因为accept而阻塞整个程序全部的内容,包括:怎么办才能实现多线程通信,不会因为accept而阻塞整个程序、linux下阻塞,非阻塞,轮询、c#socket编程关于阻塞侦听的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9835333.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存