请教多线程socket编程的几个基础性问题(50分)

  • 主题发起人 主题发起人 masm
  • 开始时间 开始时间
M

masm

Unregistered / Unconfirmed
GUEST, unregistred user!
1、如果一个线程内的阻塞socket在等待是否超时的时候,该线程被挂起,会发生什么??也就是说线程是否可以在任意指令间被中断挂起?
2、线程在运行中被挂起,在不销毁和重建的情况下,如何重头运行??销毁和重建太消耗CPU资源了。
 
很难么?
 
1, 是winsock函数被挂起
2,通过其他方式挂起线程,比如EVENT
 
能给个简单的代码么?张大侠!
 
1、线程只能被自己主动挂起,或因某个条件不具备而挂起,不能被除此之外的其它线程挂起,所以说你说的SOCKET等待时被挂起(指被主线程挂起?),这种情况是不可能发生的。
2、首先要看你是如何挂起,其次从头(这个从头也是有问题的,比如线程局部变量是否要全部初始化)运行也是要自己处理的,如果局部变量中有类的话,还要让它重新执行构造函数,就必须删除重建。

楼主对线程的很多概念还不清啊。
 
主线程不能挂起其它线程?
以前语句中有goto,非常方便,现在没了,出了循环都是顺序执行,没有回头路,初始化什么的自己来好像也不能使线程像刚建立一样运行啊!
 
1、如果一个线程内的阻塞socket在等待是否超时的时候,该线程被挂起,会发生什么??也就是说线程是否可以在任意指令间被中断挂起?
可以自己设定超时;线程被挂起,是要看线程是否已经执行完作业请求,至于在任意指令间被中断挂起,是没有意义的,在线程内部运行状态中是无法挂起。
2、线程在运行中被挂起,在不销毁和重建的情况下,如何重头运行??销毁和重建太消耗CPU资源了。
Resume 即可取消挂起
最后建议看看基本的线程编程方法


 
基本的线程编程方法?那些太简单!看懂了以后在实际应用中根本就是白痴!!
 

不会吧,这么说会线程的都是白痴啦? 在实际应用中要把线程用““好”” 那也不是简单的事情啊,不明白你说什么
 
我感觉MASM没有完全看明白挂起的真实意思,呵呵,仔细看看,多想象就应该明白了
 
线程的挂起是主线程发出的软中断还是要在被挂起的线程中自行处理?如果是软中断,显然是在执行完任意一条指令后都有可能被挂起。
线程的运行我们一般都是顺序的,也就是一个过程或函数,而不是面向事件和对象。也就是说,线程一旦运行,一般就只能从头到脚运行一遍,然后结束。我们为了让线程长时间的为我们服务,只能用while,repeat等循环,用逻辑变量开关线程。
阻塞模式的效率肯定要低于非阻塞模式,理由如下:
在系统中(不管是windows还是unix),软件系统管理硬件系统最主要的就是采用中断,试想,一个操作系统拼命的去询问每个硬件系统的状态,那效率...,惨!socket也一样,当一个数据包到达的时候,网卡势必发生一个中断信号,软件接管,接收数据,放入系统缓冲区,清空网卡上的缓冲区。如果是阻塞模式,程序得无节制的尝试读取系统缓冲区,为了不造成“死机”还得采用线程,线程之间的轮循还得消耗大量的系统资源。但是目前非阻塞模式对流量等控制就很难,远不如阻塞方便。
 
我对楼上的看法不敢苟同.理由如下:(OS是Windows/Linux/Unix...)
线程的挂起是主线程发出的软中断还是要在被挂起的线程中自行处理?如果是软中断,显然
是在执行完任意一条指令后都有可能被挂起。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
线程的管理只是操作系统的任务,其他线程只能透过系统调用来挂起线程,不存在什么软中断的问题,的确是线程在执行完任意一条指令就被挂起的可能,但是是由操作系统来挂起的,比如等待事件,等待信号等等,或者是时间片用完...或者是另外一个比他优先级高的线程就绪........

线程的运行我们一般都是顺序的,也就是一个过程或函数,而不是面向事件和对象。也就是说,线程一旦运行,一般就只能从头到脚运行一遍,然后结束。我们为了让线程长时间的为我们服务,只能用while,repeat等循环,用逻辑变量开关线程。
阻塞模式的效率肯定要低于非阻塞模式,理由如下:
在系统中(不管是windows还是unix),软件系统管理硬件系统最主要的就是采用中断,试想,一个操作系统拼命的去询问每个硬件系统的状态,那效率...,惨!
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
错,中断不是操作系统拼命的去询问硬件系统的状态,那叫做轮询,中断是说某个事件发生的时候,cpu更具一定的条件,放下手头的工作去处理中断事件.

socket也一样,当一个数据包到达的时候,网卡势必发生一个中断信号,软件接管,接收数据,放入系统缓冲区,清空网卡上的缓冲区。如果是阻塞模式,程序得无节制的尝试读取系统缓冲区,为了不造成“死机”还得采用线程,线程之间的轮循还得消耗大量的系统资源。但是目前非阻塞模式对流量等控制就很难,远不如阻塞方便。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
socket在系统中当驱动程序获得一个数据包后,操作系统会自动的使数据包的目的线程(就是调用socket函数的那个线程)上面的挂起计数减少1,从而目的线程(就是调用socket函数的那个线程)进入系统中和别的就绪线程竞争CPU资源.所以在一个线程在它等待数据的时候它不耗费cpu资源.
 
后退
顶部