互斥锁能否保护相对于特定指针的数据?
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
的指针可以在其他类中使用。
QMutexLocker
是保护ptr
的数据,还是仅保护访问函数increment
和decrement
免受多次调用?
如何在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];
}
要保护指向ptr
MyClass
指针的实例,应使用QMutexLocker(get_mutex(ptr))
。如果MyClass
是一个小对象并且大量存在,则这很有用,因此为每个实例保留单独的互斥锁成为一个问题。
相关文章:
- 将常量指针引用绑定到非常量指针
- 运行时错误:引用绑定到类型为"int"的空指针
- 创建一个函数的 Python 绑定,返回指向带有 boost 的向量的指针
- 与简单地创建派生类指针相比,将基类绑定到派生类有什么优点?
- 获取具有静态局部变量的绑定/推断捕获 lambda 的函数指针
- 努力将指向成员函数的指针绑定到类模板的T成员,然后在槽中调用
- 将引用绑定到指针的语法是什么?(各种)
- 为什么 VS 无法将右值引用绑定到指针?
- 使用 python 绑定来检查 C++ 类型是否是规范方式的指针、引用等?
- 函数参数绑定通过参考与传递指针传递数组的规则
- 排序时引用绑定到 'value_type' 类型的 null 指针
- PyBind11:绑定使用双指针的函数
- C++绑定函数到指针
- 如何破坏包含自指指针的对象
- const自动参考绑定到(NULL)指针 - 实际类型是什么
- 如何将函数指针传递给绑定
- 指向成员的指针如何知道它绑定了哪个成员
- Swig - 绑定返回对控制器类指针的引用的方法
- RValue 引用在将其绑定(非指针)对象分配给另一个指针后是否会删除该对象?
- 指您不拥有的"std::unique_ptr"(使用原始指针?