【发布时间】:2019-10-28 19:50:20
【问题描述】:
我想要一个多线程函数,它为对象obj 分配一些内存并返回分配的内存。我目前的单线程和多线程版本代码如下。
多线程版本没有竞争条件,但是当很多线程试图获取锁时运行缓慢。在malloc 和指针更新之后,每个线程仍然需要获取和释放相同的锁。这会导致一些多线程性能下降。我想知道是否还有其他方法可以提高性能。
struct multi_level_tree{
multi_level_tree* ptr[256];
mutex mtx;
};
multi_level_tree tree; // A global object that every thread need to access and update
/* Single Threaded */
multi_level_tree* get_ptr(multi_level_tree* cur, int idx) {
if (!cur[idx].ptr)
cur[idx].ptr = malloc(sizeof(T));
return cur[idx].ptr;
}
/* Multi Threaded with mutex */
void get_ptr(multi_level_tree* cur, int idx) {
if (!cur[idx].ptr) {
cur[idx].mtx.lock(); // other threads wait here, and go one by one
/* Critical Section Start */
if (!cur[idx].ptr)
cur[idx].ptr = malloc(sizeof(multi_level_tree)); // malloc takes a while
/* Critical Section End */
cur[idx].mtx.unlock();
}
return cur[idx].ptr;
}
我正在寻找的代码应该具有以下属性。
- 当第一个线程分配内存时,它应该提醒所有其他等待它的线程。
- 应同时解除所有其他线程的阻塞。
- 没有竞争条件。
问题中的挑战
* 树是稀疏的,有多个级别,考虑到我们拥有的内存,初始化所有这些是不可能的
* 类似于Double-Checked Locking 的问题,但试图避免std::atomic
这段代码的重点是将多级数组实现为全局变量。除了最低级别之外,每个数组都是指向下一级数组的指针列表。由于这个数据结构需要动态增长,所以我遇到了这个问题。
【问题讨论】:
-
为什么所有线程都必须使用相同的资源来分配内存?他们不能各自独立工作吗?
-
这就是我要问的重点。资源
obj实际上是一个全局多级数组。所有线程都想访问和更新数据结构。 @原名_463035818 -
不确定,但我认为您的多线程并不是真正的线程安全,因为在锁定互斥锁之前访问了
!o.ptr。 -
我没有看到大局,所以我只能问问题......你知道
malloc只是分配内存,而不是创建对象吗?
标签: c++ multithreading