加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 线程安全传递操作符

发布时间:2020-12-16 07:35:24 所属栏目:百科 来源:网络整理
导读:我正在为我们的堆内存管理器重写new()和new []()运算符. new()有一个互斥并且是线程安全的,但是我还没有为new []()添加一个互斥,它作为一个传递操作符,因为我怀疑它在调用时会在堆栈中.新的[]()是否在堆栈中并且不需要自己的互斥量是否正确? /*!brief Over
我正在为我们的堆内存管理器重写new()和new []()运算符. new()有一个互斥并且是线程安全的,但是我还没有为new []()添加一个互斥,它作为一个传递操作符,因为我怀疑它在调用时会在堆栈中.新的[]()是否在堆栈中并且不需要自己的互斥量是否正确?

/*!
brief Override the Standard C++ new [] operator
param size [in] Number of bytes to allocate
exception std::bad_alloc
returns Pointer to the start of the allcoated memory block of c size bytes
todo Check if this is thread-safe or if it needs a mutex lock,return address probably is on the stack so it should be ok
*/
void *operator new[] (size_t size)
{
    return operator new(size);
}

/*!
brief Overrides the Standard C++ new operator
param size [in] Number of bytes to allocate
exception std::bad_alloc
returns Pointer to the start of the allcoated memory block of c size bytes
*/
void *operator new(size_t size) 
{
    MM_ENTER_CRITICAL_SECTION(CMemoryManager::mutex)
    // Memory manager code removed since it's outside of the question context
    MM_LEAVE_CRITICAL_SECTION(CMemoryManager::mutex)
}

解决方法

Is it correct that new will be on the stack and will not need a mutex of its own?

运算符new []()的工作方式与new()类似,但它不是分配单个对象,而是分配一个对象数组.我不知道与堆栈有什么关系,分配的对象在堆上分配,并返回指向该内存的指针.

堆栈上唯一的东西就是指针本身,但两个版本的都是这种情况.

看到new []()调用new()然后我没有看到你在new []()中需要互斥的原因,因为new()已经受到互斥锁的保护.任何调用new []()的线程都必须等待另一个已经在new()中的线程.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读