1

因此,我创建了一个适用于线程的简单类 - 您可以将任何类的任何 void 函数添加到从呈现我的类继承的类的订阅函数列表中:

#include <iostream>
#include <vector>

#include <boost/thread.hpp>

// parts of c++0x std
#include <boost/bind.hpp> 
#include <boost/function.hpp>

#ifndef _CoreEvents_h_
#define _CoreEvents_h_

using namespace std ;
template <typename DataType >
class CoreEvents{

        typedef boost::function<void(DataType)>   Function;
        typedef std::vector<Function>      FunctionSequence;
        typedef typename FunctionSequence::iterator FunctionIterator; 

public:
        DataType* dataElement;
        FunctionSequence funcs;
        boost::thread_group tg;

        CoreEvents()
        {
                dataElement = new DataType();
        }
        // Function for adding subscribers functions
        // use something like std::bind(&currentClassName::FunctionToAdd, this, std::placeholders::_1) to add function to vector
        void Add(Function f)
        {
                funcs.push_back(f);
        }

        // Cast data to subscribers and clean up given pointer
        //ToDo: One  will be solved when pool of pre-initialized objects will be developed 
        virtual void Cast(){
                for (FunctionIterator it(funcs.begin()); it != funcs.end(); ++it){
                        DataType dataCopy = *dataElement;
                        tg.create_thread(boost::bind(*it, dataCopy));
                }
        }  
};

您只需要订阅:

someClass->Add(boost::bind(&someOtherClass::someVoidFunction, this, _1)); 

当我们处理线程时这很简单——我们总是可以调用例如 create_thread 并在其他应用程序线程中完成我们需要的所有工作。

但是,如果我们有 app1 app2 和 app3 并且您想从一个进程共享一个函数的指针并使用代理应用程序将该指针指向另一个应用程序,以便可以使用上一个进程/应用程序的参数调用它呢?

在现实生活中,如果我们有一个运行不可编辑文本字段的应用程序,以及一个运行可编辑文本字段的应用程序,它看起来会像这样。我们有 3 号应用程序,它可以将可编辑 TF 的输入连接到不可编辑的 TF。

Boost.Interprocess是否有可能以及如何做这样的事情?

我对 C++ 很陌生,但我认为我发现了一些相关的不良信息

禁止引用

引用遭受与指针相同的问题(主要是因为它们被实现为指针)。但是,目前在 C++ 中无法创建完全可用的智能引用(例如,运算符 .() 不能重载)。因此,如果用户想要将对象放入共享内存中,则该对象不能有任何(智能或非智能)引用作为成员。

仅当映射区域在共享内存段的所有进程中映射到相同的基地址时,引用才会起作用。与指针一样,放置在映射区域中的引用应该只指向该映射区域的对象。

虚拟禁止

虚表指针和虚表是在构造对象的进程的地址空间中,所以如果我们放置一个带有虚函数或虚基类的类,放在共享内存中的虚指针对于其他进程就无效了,他们会崩溃。

这个问题很难解决,因为每个进程都需要一个不同的虚拟表指针,并且包含该指针的对象在许多进程之间共享。即使我们在每个进程中将映射区域映射到相同的地址,虚拟表也可以在每个进程中位于不同的地址。要为进程之间共享的对象启用虚函数,需要对编译器进行深度更改,并且虚函数会受到性能影响。这就是为什么 Boost.Interprocess 没有任何计划在进程之间共享的映射区域中支持虚拟功能和虚拟继承。

小心静态类成员

类的静态成员是类的所有实例共享的全局对象。因此,静态成员在进程中被实现为全局变量。

在构造具有静态成员的类时,每个进程都有自己的静态成员副本,因此在一个进程中更新静态成员不会改变另一个进程中静态成员的值。所以要小心这些类。如果静态成员只是在进程启动时初始化的常量变量,那么它们并不危险,但它们根本不会改变(例如,当像枚举一样使用时)并且它们的值对所有人都是相同的。

但我正在使用同一个库创建我所有的应用程序。当我需要最佳性能时,我将使用线程,但碰巧我需要进程间通信。那么我该怎么办 - 如何创建一种机制来模拟急需的功能?

4

1 回答 1

2

抱歉,这个问题有点难以理解,但我会尽力回答。

在进程之间共享函数指针是你几乎应该做的事情。这是非常危险的。共享非原始数据也是不受欢迎的,但在某些情况下还可以。

通常,您应该为此使用消息传递之类的东西。您可能希望使用 Boost.Interprocess 来共享参数。

于 2011-03-02T13:05:15.197 回答