gpt4 book ai didi

c++ - 如何在两个类之间共享单个临界区

转载 作者:行者123 更新时间:2023-11-30 04:34:54 25 4
gpt4 key购买 nike

对于在不同类层次结构中的两个类之间共享相同临界区对象的问题,我很难找到正确的设计解决方案。

想象一下:

class IB;
class IA {
public: void method_one();
};
class A : public IA {
IB* m_ib;
};

class IB {
public: void method_two();
};
class B : public IB {
IA* m_ia;
};

现在,对 method_one() 和 method_two() 的调用应该是同步的。我碰巧使用了 critical_section 对象进行同步,但不知道我应该怎么做。

我设法想出了一些想法:

  1. BAD - 创建 A 或 B 的合适成员 (critical_section m_cs;),并且
    a) 从 IA 向下转换为 A(或分别从 IB 向下转换为 B),并使用它
    b) 使其静态化,并调用A::m_cs(或B::m_cs)

  2. 更好 - 创建额外的单一对象/结构来管理 critical_section 对象并提供对其的访问:

    class CriticalSectionProvider {
    //(...)
    public:
    static critical_section& GetIt() { static critical_section cs; return cs; }
    }

不幸的是,我对这些都不满意,我认为有人可能有更好的主意。

在这种情况下如何在两个类之间共享单个临界区?

最佳答案

最简单的方法是:在创建要在其间共享对象的任何线程之前,在 main() 中创建一个 critical_section 的实例。

将其传递给类的构造函数并将其存储为引用:

class A : public IA { 
IB* m_ib;
critical_section & m_cs; //reference
public:
A(critical_section & cs) : m_cs(cs) {}
};

class B : public IB {
IA* m_ia;
critical_section & m_cs; //reference
public:
B(critical_section & cs) : m_cs(cs) {}
};

int main()
{
critical_section cs = /*create it*/;

A a = cs; //call the constructor, passing the reference
B b = cs; //call the constructor, passing the reference
}

关于c++ - 如何在两个类之间共享单个临界区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5696142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com