- 论坛徽章:
- 0
|
非常感谢大家的指导.的确,我是把静态的代码编译共享和动态的进程运行没有说清楚.我解释一下这个问题的背景,也顺便进一步请教大家.也解释一下为什么我有这个疑惑.
这个应该,应该最开始只有一个进程,然后分出了好几个线程.因为线程共享进程的空间.所以这些线程(在这个应用中映射为各个不同task)共享了很短全局变量(不是那种系统提供的让进程共享的全局数据).所以看起来这个应用有很多模块.从代码的角度来看,各个模块间有很多函数调用.
现在这个系统要升级,task要映射到进程,也就是说原来的很多线程要变成进程.这就涉及到原来的很多全局变量以及与之相关的函数调用的code修改,这里的函数主要是用来读写这些全局变量,不过却没有互斥机制.我不知道线程的工作机制,不过我想这应该要有的吧,不知道为什么原来的应用他们没有写,或者是我对多线程的理解有误.
当然,我想,就算是线程,原来的函数也只是代码的共用,编译link后都变成各个线程自己的代码装载了.在这种情况下,这个全局变量存储在整个进程中只有一份,对所有的线程而言,当然也只有一份,这也是为什么称它为全局变量.
现在有人说这些变量和函数调用依然要保留不动,我很不能理解.
我想如果要保留这些东西,只有两种可能性,一种是将原来的那种全局变量升级成进程共享的数据,然而这样一来做的话,需要加上互斥这些操作,这样一来,不论是变量还是那些调用函数,都需要修改.二是以以下的方式.我写了一段伪码:
type var1, var2.
void main()
{
...
fork child process 1
fork child process 2
}
这样一来,通过在应用的入口,也就是主进程中初始化这些所谓的全局变量. 然后所有的各个子进程在自己的数据空间中在存储一份这些变量.如上面的代码,就有3份数据了,这也不能叫什么全局变量!!!!
前面两种方法我都觉得不可以理解,我想最后可能还是要用消息传递这些数据,那这样一来那些所谓的我前面所说的"进程间的函数调用"就要去掉了!
我现在也不太清楚有人说的原来的那些变量不变,函数调用也不变到底是个啥意思! |
|