对多子进程的统制
对多子进程的控制
问题有点复杂,我先慢慢说。望高手耐心看完;
软件功能是基于sock 的远程控制软件,由多台客服端同时控制多台服务端。多台服务端上有几十上百个不重复的须要启动的子进程。由客服端通过发包控制这些服务器启动这些子进程。而且这些子进程不能出现意外崩溃,或退出的情况,如果出现意外将由服务端程序自动重启,
数据结构和网络通讯都写好了。每一个socket对应一个服务器。然后我在服务器每收到一个客户端发来的请求启动子进程的包时,去另开一个线程去启动这个子进程。因为要保证子进程出现异常时可以自动由服务端重启,所以我以DEBUG模式启动子进程,然后使用WaitForDebugEvent函数无限循环侦听子进程的状态。所以我必须开新线程去启动这个子进程,将WaitForDebugEvent函数放进新线程里去侦听这个子进程的运行。
现在问题就来了,当我客服端发送一个请求包,要求服务端启动一个子进程时,子进程尚在启动状态,此时客户端又连续发送请求包要求启动这个子进程,结果服务端的数据就会很混乱。
因为以上问题的存在,所以我让子进程成功启动后向服务端主线程发送一个消息。虽然现在我已经知道子进程何时启动完成,但是我还是无法限止客户端对同一子进程的连续启动。
问题说的有点乱。大概意思就是。我要以一个子线程去启动一个子进程,但是在未收到进程启动完成的情况下,不允许其它子进程启动,更不允许同一子进程再次启动。因为子进程启动开始是在子线程建立时开始的,而子进程结束是在主线程收到消息时完结的,我不知道该以何种方式将这段代码保护起来,也就是说在建立一个新的子线程开始,到收到消息之间的这段时间内,不允许其它线程再去访问这段代码。我在子线程建立时建立了一个临界区对象,但是我却不能在子线程结束时释放这个临界区对象,因为子线程一但建立就不会结束,除非这个子线程中的子进程结束。如果我放释放这个临界区对象的操作放到主线程响应子进程启动完成的消息里不知道这样行不?,但是我觉得这样还是不够严禁。望高手指点一两。说的有点乱。老大们花点时间看一下吧,谢谢了
------解决方案--------------------
我的意思也很明确的嘛,比如你可以写个函数,叫CRITICAL_SECTION *GetCirticalSection(char *p),在里面建一张全局的表,根据进程的名称或者ID等去找对应的临界区,如果不存在就新建一个,这样把这个临界区通过线程参数传进去,进行锁定.达到的目的就是一个进程对应一个临界区,不能重复开启多个同样的进程,但是不同的进程之间又不互相干扰.
------解决方案--------------------
临界区一般是用在线程间同步的,也就是线程A Enter进去的,必须要A Leave才有效,如果在主线程中Leave也是没有效果的.临界区还是锁着的.
问题有点复杂,我先慢慢说。望高手耐心看完;
软件功能是基于sock 的远程控制软件,由多台客服端同时控制多台服务端。多台服务端上有几十上百个不重复的须要启动的子进程。由客服端通过发包控制这些服务器启动这些子进程。而且这些子进程不能出现意外崩溃,或退出的情况,如果出现意外将由服务端程序自动重启,
数据结构和网络通讯都写好了。每一个socket对应一个服务器。然后我在服务器每收到一个客户端发来的请求启动子进程的包时,去另开一个线程去启动这个子进程。因为要保证子进程出现异常时可以自动由服务端重启,所以我以DEBUG模式启动子进程,然后使用WaitForDebugEvent函数无限循环侦听子进程的状态。所以我必须开新线程去启动这个子进程,将WaitForDebugEvent函数放进新线程里去侦听这个子进程的运行。
现在问题就来了,当我客服端发送一个请求包,要求服务端启动一个子进程时,子进程尚在启动状态,此时客户端又连续发送请求包要求启动这个子进程,结果服务端的数据就会很混乱。
因为以上问题的存在,所以我让子进程成功启动后向服务端主线程发送一个消息。虽然现在我已经知道子进程何时启动完成,但是我还是无法限止客户端对同一子进程的连续启动。
问题说的有点乱。大概意思就是。我要以一个子线程去启动一个子进程,但是在未收到进程启动完成的情况下,不允许其它子进程启动,更不允许同一子进程再次启动。因为子进程启动开始是在子线程建立时开始的,而子进程结束是在主线程收到消息时完结的,我不知道该以何种方式将这段代码保护起来,也就是说在建立一个新的子线程开始,到收到消息之间的这段时间内,不允许其它线程再去访问这段代码。我在子线程建立时建立了一个临界区对象,但是我却不能在子线程结束时释放这个临界区对象,因为子线程一但建立就不会结束,除非这个子线程中的子进程结束。如果我放释放这个临界区对象的操作放到主线程响应子进程启动完成的消息里不知道这样行不?,但是我觉得这样还是不够严禁。望高手指点一两。说的有点乱。老大们花点时间看一下吧,谢谢了
------解决方案--------------------
我的意思也很明确的嘛,比如你可以写个函数,叫CRITICAL_SECTION *GetCirticalSection(char *p),在里面建一张全局的表,根据进程的名称或者ID等去找对应的临界区,如果不存在就新建一个,这样把这个临界区通过线程参数传进去,进行锁定.达到的目的就是一个进程对应一个临界区,不能重复开启多个同样的进程,但是不同的进程之间又不互相干扰.
------解决方案--------------------
临界区一般是用在线程间同步的,也就是线程A Enter进去的,必须要A Leave才有效,如果在主线程中Leave也是没有效果的.临界区还是锁着的.