本萌新最近在看多进程编程,其中服务器设计通过进程池,而进程池采用单例模式实现。大致了解了一下单例模式,但其在多进程中的应用还是不理解。望大佬解答。
具体设计是这样的,进程池类构造函数为私有,有一个静态函数和一个静态类实例,在静态函数中调用构造函数new类对象(如果实例存在就直接返回这个实例),而在构造函数中通过循环创建子进程并且赋予标识(一个类成员)。我想不通的是,在多进程的情况下,子进程应该复制了资源,所以应该每个进程都有一个实例啊?这样怎么实现单例呢。
还有,如果只有一个实例,那其成员变量为什么会随着进程的切换而改变呢?
这文章看了有帮助么: https://blog.csdn.net/qq_29542611/article/details/79301595
我大致浏览了一下,但是多线程和多进程本质上还是不一样的呀。多进程会复制资源,进程之间是不共享数据的,那我这个进程的实例对象为什么可以被其他进程所使用呢,或者说父进程创建的实例是怎么被其他进程接收到的呢。
再看: (8条消息) 多线程调用单例模式的类的同一个方法,是不是需要排队调用?_通往架构师之路-CSDN博客_多线程调用同一个方法
最好有些代码, 这样别人知道你在具体谈论什么。
class test {
private:
test();
public:
~test() {}
static test* create(){
if(!m_only){
m_only = new test();
}
return m_only;
}
public:
pid_t m_id;
static test* m_only;
};
test* test::m_only = NULL;
test::test()
{
m_id = fork();
assert(m_id >= 0);
if(m_id > 0)
m_id += 1;
else
m_id += 2;
}
int main()
{
test* only = test::create();
printf("%d\n", only->m_id);
return 0;
}
差不多这样,在构造函数中创建进程,父子进程共享一个实例吗?那子进程在new test(),即构造函数完成之后返回了什么呢