互斥锁能否保护相对于特定指针的数据?

Could the mutex protect the data relative to the specific pointer?

本文关键字:指针 定指 数据 相对于 保护      更新时间:2023-10-16

我的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];
}

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