我想知道如果两个线程同时请求分配内存时,是否存在内存分配锁。我正在使用OpenMP进行多线程编程,使用C++代码。
操作系统:主要是Linux,但也想了解Windows和Mac的情况。
我想知道如果两个线程同时请求分配内存时,是否存在内存分配锁。我正在使用OpenMP进行多线程编程,使用C++代码。
操作系统:主要是Linux,但也想了解Windows和Mac的情况。
默认情况下,使用Win API堆函数时,Windows会锁定堆。
您可以在堆创建时控制锁定。不同的编译器和C运行时对malloc/free系列函数的处理方式不同。例如,SmartHeap API曾经为每个线程创建一个堆,因此不需要锁定。还有一些配置选项可用于打开或关闭该行为。
在90年代初/中期,Borland Windows和OS/2编译器明确关闭了堆锁定(过早优化错误),直到使用beginthread启动多个线程。许多人尝试使用OS API调用生成线程,然后惊讶地发现堆损坏了...
自由存储是一种共享资源,必须进行同步。分配/释放的成本很高。如果您为了性能而使用多线程,则频繁的分配/释放可能会成为瓶颈。通常情况下,避免在紧密循环内部进行分配/释放。另一个问题是虚假共享。