【问题标题】:Synchronization of context object上下文对象的同步
【发布时间】:2012-02-27 17:21:41
【问题描述】:

我的应用程序被划分为一些较小的域,为了减少它们之间的依赖关系,我将使用上下文对象。让我们考虑一个简单的例子:

class SomeType1;
class SomeType2;    
class dummy;

//context for first domain
class foo
{
public:
    virtual void setPtr1 (SomeType1* val) = 0;
    virtual SomeType2* getPtr2 () = 0;

    static foo* getCTX()
    {
        //statement bellow is a singleton which creates one instance of dummy and
        //returns its address as foo*
        return AppCTX::AccessorType<dummy>::getCTX<foo>();
    }
    virtual ~foo();
};

//context for second domain
class bar
{
public:
    virtual void setPtr2 (SomeType2* val) = 0;
    virtual SomeType1* getPtr1 () = 0;
    static bar* getCTX()
    {
         //same as above but casts dummy* to bar*
         return AppCTX::AccessorType<dummy>::getCTX<bar>();
    }
    virtual ~bar();
};

//dummy is a singleton created in AppCTX::AccessorType<dummy>
class dummy: public foo, public bar
{
public:
    virtual void setPtr1 (SomeType1* val)
    {
         ptr1 = val;
    }

    virtual SomeType1* getPtr1 ()
    {
         return ptr1;
    } 

    virtual void setPtr2 (SomeType2* val)
    {
         ptr2 = val;
    }

    virtual SomeType2* getPtr2 ()
    {
         return ptr2;
    } 
    virtual ~dummy();
private:
    SomeType1* ptr1;
    SomeType2* ptr2;
};

我的域启动多个使用上下文的线程,因此 ptr1 和 ptr2 可以并行访问。我需要将 setPtrs 和 getPtrs 与互斥锁同步吗? ptr1 和 ptr2 是否有可能以某种方式损坏?

【问题讨论】:

    标签: c++ multithreading synchronization mutex


    【解决方案1】:

    将 getPtr 和 setPtr 函数互斥不会很有价值。即使在调用者获得指针并释放互斥体之后,它仍然可以使用它收到的指针做任何它想做的事情。这肯定会导致多线程出现问题。

    您实际上希望将锁定机制放在 SomeType1 和 SomeType2 类本身中。例如,您可以在 SomeType1 的每个成员函数的开头获取一个互斥体,然后在每个成员函数返回之前释放该互斥体。

    您的某些成员函数可能已经是线程安全的。例如,如果它们不访问成员变量或任何其他共享资源,那么线程之间就不可能发生争用。因此,您不必对它们进行互斥。但是您需要查看每个成员函数,并问自己如果这些函数使用的成员变量意外更改会发生什么。如果该行为不受欢迎,则该成员函数应该是互斥的。

    但是,如果您担心的是实际的指针变量本身被破坏,这取决于您正在编译的机器架构。对于许多系统(32 位指针的分配是原子操作),这根本不是问题。这个问题得到了更全面的回答here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      相关资源
      最近更新 更多