gpt4 book ai didi

c++ - 上下文对象的同步

转载 作者:太空宇宙 更新时间:2023-11-04 12:11:49 24 4
gpt4 key购买 nike

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

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 是否有可能以某种方式损坏?

最佳答案

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

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

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

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

关于c++ - 上下文对象的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9469272/

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