C++ C+中的线程安全删除+;

C++ C+中的线程安全删除+;,c++,multithreading,c++11,delete-operator,C++,Multithreading,C++11,Delete Operator,我的问题不是如何从头开始创建这个特性,而是我的实现是否可以使用 我有接下来的课程: 类指针存储 { 私人: 静态std::互斥锁m; 静态标准::无序的集合指针; 公众: 静态内联void add(void*ptr){ m、 锁(); 指针存储::指针.insert(ptr); m、 解锁(); } 静态内联bool tryRemove(void*ptr){ 标准:锁紧装置g(m); 返回指针存储::指针.擦除(ptr); } 静态内联bool hasPtr(void*ptr){ 标准:锁紧装置

我的问题不是如何从头开始创建这个特性,而是我的实现是否可以使用

我有接下来的课程:

类指针存储
{
私人:
静态std::互斥锁m;
静态标准::无序的集合指针;
公众:
静态内联void add(void*ptr){
m、 锁();
指针存储::指针.insert(ptr);
m、 解锁();
}
静态内联bool tryRemove(void*ptr){
标准:锁紧装置g(m);
返回指针存储::指针.擦除(ptr);
}
静态内联bool hasPtr(void*ptr){
标准:锁紧装置g(m);
返回指针存储::指针.find(ptr)!=指针存储::指针.end();
}
};
类可删除
{
公众:
void*运算符新(大小\u t大小){
void*p=malloc(尺寸);
指针存储::添加(p);
返回p;
}
void操作符删除(void*ptr){
if(指针存储::tryRemove(ptr)){
免费(ptr);
}
}
};
我的想法是在必要时继承
Deletable
,并使用操作符

但我想知道这种情况是否可能:

  • 我在变量
    OBJ
    中创建了一个对象,并将其删除
  • 我在另一个变量中创建了一个新对象,它的地址与
    OBJ
    中的地址相同,并且
    OBJ
    上的删除操作会影响我的新对象

通常,您不应假设用于旧对象的指针不会被用于新对象

有时候你会想做出这样的假设

对于多线程程序,当您希望确保指针不被重复使用时,这种情况是ABA问题。简单地说,当您比较旧指针和新指针的交换时,就会出现这个问题,但是您不能确定旧指针确实是旧指针

其中一个解决方案基本上是将旧指针保留一段时间,这称为

另一种方法不仅依赖于指针值,还依赖于计数器(尽管计数器仍然可以环绕,但失败的概率较低)


通常,最好的解决方案是不要在需要假设旧指针不被重用的情况下运行。ABA问题是一个特例,但具体到无锁,当避免可能意味着根本没有无锁算法时。

一般来说,您不应该假设用于旧对象的指针没有用于新对象

有时候你会想做出这样的假设

对于多线程程序,当您希望确保指针不被重复使用时,这种情况是ABA问题。简单地说,当您比较旧指针和新指针的交换时,就会出现这个问题,但是您不能确定旧指针确实是旧指针

其中一个解决方案基本上是将旧指针保留一段时间,这称为

另一种方法不仅依赖于指针值,还依赖于计数器(尽管计数器仍然可以环绕,但失败的概率较低)


通常,最好的解决方案是不要在需要假设旧指针不被重用的情况下运行。ABA问题是一个特例,但具体到无锁,当避免可能意味着根本没有无锁算法时。

为什么需要这个?线程之间共享的对象上的任何变异操作都需要锁定。为什么要单独删除?不管怎样,我认为你描述的情况没有问题。一个新的对象地址可能与一个旧的已删除对象地址相同,它会如何影响任何东西?但是我有一个事件系统,它可能在不同的侦听器中有相同的指针(或者甚至是相同的侦听器,因为它们可以在不同的线程中执行)。我不确定你为什么认为这很重要。当对象处于活动状态时,只有该对象具有此地址。删除对象后,将不再存在具有该地址的对象,并且可以重用该对象。如果您在程序中保留可能删除的对象的地址,那么您就会遇到与线程无关的问题。为什么需要这个?线程之间共享的对象上的任何变异操作都需要锁定。为什么要单独删除?不管怎样,我认为你描述的情况没有问题。一个新的对象地址可能与一个旧的已删除对象地址相同,它会如何影响任何东西?但是我有一个事件系统,它可能在不同的侦听器中有相同的指针(或者甚至是相同的侦听器,因为它们可以在不同的线程中执行)。我不确定你为什么认为这很重要。当对象处于活动状态时,只有该对象具有此地址。删除对象后,将不再存在具有该地址的对象,并且可以重用该对象。如果您在程序中保留可能被删除对象的地址,那么您就会遇到与线程无关的问题。