小编Riz*_*zar的帖子

如何通过numpy广播来防止添加两个数组?

Numpy拥有非常强大的广播机制.它甚至可以添加1x2和2x1阵列而不会发出任何警告.我不喜欢这样的行为:99%的概率这样的添加是我的错误的结果,我想要抛出异常.问题:是否有类似的东西:

numpy.safe_add(A,B)
Run Code Online (Sandbox Code Playgroud)

仅当A和B具有完全相同的形状时才有效?

python numpy

14
推荐指数
1
解决办法
975
查看次数

在C++,x86-64中读写线程安全的智能指针

我开发了一些无锁数据结构,并出现以下问题.

我有编写器线程在堆上创建对象并使用引用计数器将它们包装在智能指针中.我也有很多读者线程,可以使用这些对象.代码可能如下所示:

SmartPtr ptr;

class Reader : public Thread {
    virtual void Run {
       for (;;) {
           SmartPtr local(ptr);
           // do smth   
       }
    }   
};

class Writer : public Thread {
    virtual void Run {
       for (;;) {
           SmartPtr newPtr(new Object);    
           ptr = newPtr;  
       }
    }
};

int main() {
    Pool* pool = SystemThreadPool();
    pool->Run(new Reader());
    pool->Run(new Writer());
    for (;;) // wait for crash :(
}
Run Code Online (Sandbox Code Playgroud)

当我创建它的线程局部副本ptr至少意味着

  1. 读一个地址.
  2. 增加参考计数器.

我无法原子地执行这两个操作,因此有时候我的读者会使用已删除的对象.

问题是 - 我应该使用什么样的智能指针来从几个线程进行读写访问,并且可以进行正确的内存管理?解决方案应该存在,因为Java程序员甚至不关心这样的问题,只是依赖于所有对象都是引用,并且只有在没有人使用它们时才会被删除.

对于PowerPC,我发现http://drdobbs.com/184401888,看起来不错,但使用了我们在x86中没有的Load-Linked和Store-Conditional指令.

据我所知,boost指针仅使用锁提供此类功能.我需要无锁解决方案.

c++ x86 smart-pointers thread-safety lock-free

5
推荐指数
1
解决办法
2779
查看次数

标签 统计

c++ ×1

lock-free ×1

numpy ×1

python ×1

smart-pointers ×1

thread-safety ×1

x86 ×1