具有C ++中所有同步方法的类

用户名

在Java中,我们可以创建一个类

class Test {
    public synchronized void  fn1() {

    }

    public synchronized void  fn2() {

    }

    public synchronized void  fn3() {
        fn1(); // Calling another method
    }
}

在C ++中,如果我想模仿功能,一种方法是

class Test {
    private:
        mutex obj;
    public:
       void fn1(bool calledFromWithinClass = false) {
            if(calledFromWithinClass) 
                fn1Helper();
            else
                unique_lock<mutex> lock(obj);
                fn1Helper();
        }

       void fn2(bool calledFromWithinClass = false) {
            if(calledFromWithinClass) 
                fn2Helper();
            else
                unique_lock<mutex> lock(obj);
                fn2Helper();
        }

        void fn3(bool calledFromWithinClass = false) {
            if(calledFromWithinClass) 
                fn3Helper();
            else {
                unique_lock<mutex> lock(obj);
                fn3Helper();
            } 
        }
    private:
        void fn1Helper() {
        }

        void fn2Helper() {
        }

        void fn3Helper() {
             fn1(true);
        }
}
int main() {
    Test obj;
    obj.fn1();
    obj.fn2(); 
    // i.e from outside the class the methods are called with calledFromWithinClass as false.
}

简而言之,我要做的就是使用RAII进行锁定以及允许函数相互调用。在C ++中,如果没有外部函数已获取锁,则内部函数无法获取该锁,并且代码被卡住。

如您所见,代码很复杂,在C ++中还有其他方法可以做到这一点。

我只能使用C ++ 98,并且可以假定该类中的所有方法都是同步的(即需要锁)

安东·萨文(Anton Savin)

我可以提出两种选择:

  1. 只需使用boost::recursive_mutex代替(或std::recursive_mutex在C ++ 11中)。

  2. (更好)始终从您的同步代码中调用非同步的私有实现:

    class Test {
    private:
        mutex obj;
    public:
       void fn1() {
            unique_lock<mutex> lock(obj);
            fn1Helper();
        }
    
       void fn2(bool calledFromWithinClass = false) {
            unique_lock<mutex> lock(obj);
            fn2Helper();
        }
    
    private:
        void fn1Helper() {
        }
    
        void fn2Helper() {
            fn1Helper();
        }
    }
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

弃用Rails中所有类方法的最佳方法

来自分类Dev

C ++中所有内容的基类

来自分类Dev

Swift 中所有类的根类?

来自分类Dev

获取JavaScript中所有类的实例

来自分类Dev

类标记中所有值的总和

来自分类Dev

类中所有元素的悬停效果

来自分类Dev

我如何从Mono中的c ++获取某个类中所有方法的列表?

来自分类Dev

WPF:同步ItemsControl中所有项目的宽度

来自分类Dev

具有同步属性的类

来自分类Dev

动态调用向量中所有对象的C ++类成员

来自分类Dev

如何使用单元/测试类文件中所有文件共享的通用方法(如登录方法)?

来自分类Dev

如何获取类(Java)中所有方法的方法参考?

来自分类Dev

如何利用单元/测试类文件中所有文件共享的通用方法(如登录方法)?

来自分类Dev

强制转换实现接口中所有方法的类

来自分类Dev

类列表中所有方法的AspectJ切入点

来自分类Dev

您可以提取类中所有方法的签名吗?

来自分类Dev

生成Java代码库中所有类和方法的列表

来自分类Dev

获取案例类中所有字段的类型及其方法的列表

来自分类Dev

如何使用类方法计算数组中所有值的平均值

来自分类Dev

控制器类中所有方法的通用代码

来自分类Dev

删除Ruby中所有文件的方法

来自分类Dev

具有属性和同步方法的静态类

来自分类Dev

类目标c中所有方法的lldb断点

来自分类Dev

具有定义/捕获的所有可能方法的类

来自分类Dev

在Eclipse中,如何查找锁定特定类实例的所有Java同步块/方法

来自分类Dev

在Eclipse中,如何查找锁定特定类实例的所有Java同步块/方法

来自分类Dev

如何同步类python3中的所有方法?

来自分类Dev

解析PFQuery不返回类中所有对象的数组

来自分类Dev

更改CSS中表类中所有td的颜色

Related 相关文章

  1. 1

    弃用Rails中所有类方法的最佳方法

  2. 2

    C ++中所有内容的基类

  3. 3

    Swift 中所有类的根类?

  4. 4

    获取JavaScript中所有类的实例

  5. 5

    类标记中所有值的总和

  6. 6

    类中所有元素的悬停效果

  7. 7

    我如何从Mono中的c ++获取某个类中所有方法的列表?

  8. 8

    WPF:同步ItemsControl中所有项目的宽度

  9. 9

    具有同步属性的类

  10. 10

    动态调用向量中所有对象的C ++类成员

  11. 11

    如何使用单元/测试类文件中所有文件共享的通用方法(如登录方法)?

  12. 12

    如何获取类(Java)中所有方法的方法参考?

  13. 13

    如何利用单元/测试类文件中所有文件共享的通用方法(如登录方法)?

  14. 14

    强制转换实现接口中所有方法的类

  15. 15

    类列表中所有方法的AspectJ切入点

  16. 16

    您可以提取类中所有方法的签名吗?

  17. 17

    生成Java代码库中所有类和方法的列表

  18. 18

    获取案例类中所有字段的类型及其方法的列表

  19. 19

    如何使用类方法计算数组中所有值的平均值

  20. 20

    控制器类中所有方法的通用代码

  21. 21

    删除Ruby中所有文件的方法

  22. 22

    具有属性和同步方法的静态类

  23. 23

    类目标c中所有方法的lldb断点

  24. 24

    具有定义/捕获的所有可能方法的类

  25. 25

    在Eclipse中,如何查找锁定特定类实例的所有Java同步块/方法

  26. 26

    在Eclipse中,如何查找锁定特定类实例的所有Java同步块/方法

  27. 27

    如何同步类python3中的所有方法?

  28. 28

    解析PFQuery不返回类中所有对象的数组

  29. 29

    更改CSS中表类中所有td的颜色

热门标签

归档