gpt4 book ai didi

c++ - 线程安全传递运算符

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:11:33 24 4
gpt4 key购买 nike

我正在为我们的堆内存管理器覆盖new()new[]() 运算符。 new() 有一个 mutex 并且是线程安全的,但我没有向 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() 中,则任何调用 new[]() 的线程都必须等待。

关于c++ - 线程安全传递运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15336640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com