互斥体能否保护与特定指针相关的数据?
Could the mutex protect the data relative to the specific pointer?
我的 Qt 应用程序使用 QMutex
和 QMutexLocker
来确保线程安全。
互斥量是否保护函数的数据或范围?
例如:
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
的指针可用于其他 class。
QMutexLocker
是保护 ptr
的数据还是仅保护访问函数 increment
和 decrement
免受多次调用?
如何保护 ptr
上的数据?
确保所有使用相同 QMutex
实例的线程互斥,例如它保护数据。因此另一个 class 无法同步其对 MyClass
的访问,因为它无法访问互斥锁(除非您可以确保两个线程不接触相同的成员字段)。
您应该保证每个访问 MyClass
实例的人都使用相同的互斥实例。这可以通过以下方式完成:
- 将互斥量移动到
MyClass
实例。这可能是您最需要的。
- 使用单个全局互斥锁池并使用
MyClass
实例地址来 select 它的互斥锁。
后一种方式如下图:
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];
}
要保护指向 ptr
的 MyClass
指针的实例,您应该使用 QMutexLocker(get_mutex(ptr))
。如果 MyClass
是一个小对象并且它大量存在,那么这很有用,因此为每个实例保留一个单独的互斥锁就成了一个问题。
我的 Qt 应用程序使用 QMutex
和 QMutexLocker
来确保线程安全。
互斥量是否保护函数的数据或范围?
例如:
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
的指针可用于其他 class。
QMutexLocker
是保护 ptr
的数据还是仅保护访问函数 increment
和 decrement
免受多次调用?
如何保护 ptr
上的数据?
确保所有使用相同 QMutex
实例的线程互斥,例如它保护数据。因此另一个 class 无法同步其对 MyClass
的访问,因为它无法访问互斥锁(除非您可以确保两个线程不接触相同的成员字段)。
您应该保证每个访问 MyClass
实例的人都使用相同的互斥实例。这可以通过以下方式完成:
- 将互斥量移动到
MyClass
实例。这可能是您最需要的。 - 使用单个全局互斥锁池并使用
MyClass
实例地址来 select 它的互斥锁。
后一种方式如下图:
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];
}
要保护指向 ptr
的 MyClass
指针的实例,您应该使用 QMutexLocker(get_mutex(ptr))
。如果 MyClass
是一个小对象并且它大量存在,那么这很有用,因此为每个实例保留一个单独的互斥锁就成了一个问题。