gpt4 book ai didi

c++ - 互斥体能否保护与特定指针相关的数据?

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

我的 Qt 应用程序使用 QMutexQMutexLocker 来确保线程安全。

互斥量是否保护函数的数据或范围?

例如:

class Counter
{
public:
Counter() { *ptr; }
void setObject(MyClass *pr){ptr = pr;}

void increment() { QMutexLocker locker(&mutex); //dowork for ptr; }
void decrement() { QMutexLocker locker(&mutex); //dowork for pointer to MyClass, ptr; }

private:
mutable QMutex mutex;
MyClass *ptr;
};

//Thread...
Counter counter;
MyClass *mclass= new MyClass;
//setting... mclass
counter.setOjbect(mclass);

OtherClass oc; //This `OtherClass` also works for mclass same as the value of Counter.
oc.setObject(mclass); //Counter and OtherClass work for mclass.
//Mutex protect mclass data?

指向 MyClass 的指针可以在其他一些类中使用。

QMutexLocker 是否保护 ptr 的数据或仅保护访问函数 incrementdecrement 免受多次调用?

如何保护 ptr 中的数据?

最佳答案

确保所有线程使用相同的 QMutex 实例互斥,例如它保护数据。因此,另一个类无法同步其对 MyClass 的访问,因为它无法访问互斥体(除非您可以确保两个线程不接触相同的成员字段)。

您应该保证访问MyClass 实例的每个人都使用相同的互斥实例。这可以通过以下方式完成:

  • 将互斥量移动到 MyClass 实例。这是您最有可能需要的。
  • 使用单个全局互斥锁池并使用 MyClass 实例地址为其选择互斥锁。

后一种方式如下图所示:

const std::size_t SIZE = 47; // prime numbers work better here
statuc QMutex g_mtx[SIZE];

QMutex &get_mutex(const void *ptr)
{
return g_mtx[std::uintptr_t(ptr) % SIZE];
}

要保护 MyClass 指针指向 ptr 的实例,您应该使用 QMutexLocker(get_mutex(ptr))。如果 MyClass 是一个小对象并且存在大量对象,这将很有用,因此为每个实例保留一个单独的互斥锁就成了一个问题。

关于c++ - 互斥体能否保护与特定指针相关的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51785392/

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