我仍在努力调试一个非常难以察觉的内存损坏问题。我遇到了一段代码,它在一个线程上分配内存,在另一个线程上删除内存。
我有一种模糊的感觉,这是错误的,但我不确定为什么。这些线程共享进程内存,并且通过互斥保护对这些结构的访问,因此我认为一切都应该正常工作。然而,我是否存在任何看不到的危险?
我仍在努力调试一个非常难以察觉的内存损坏问题。我遇到了一段代码,它在一个线程上分配内存,在另一个线程上删除内存。
我有一种模糊的感觉,这是错误的,但我不确定为什么。这些线程共享进程内存,并且通过互斥保护对这些结构的访问,因此我认为一切都应该正常工作。然而,我是否存在任何看不到的危险?
正如@monjardin另一个答案中所指出的那样,你试图做的事情本质上没有问题。
另外,如果多线程对你来说是新的,或者你正在处理的应用程序是新的,你需要确保你正在使用的标准支持库是线程安全版本的库。在许多环境/平台上,开发人员可以同时使用单线程和多线程版本的支持库。如果你正在使用线程,但链接到单线程版本的库,可能会发生很多糟糕的事情。例如,在单线程支持库中的malloc()和free()不会为堆(作为一种优化)提供互斥保护。多线程版本的库将添加互斥保护以支持多个线程同时操作堆。(这只是一个例子)。
请记住,内存管理器本身也必须是线程安全的,而不仅仅是您对内存的使用。请查阅您平台的文档。
没问题,这很好,特别是在使用CreateThread进行Windows编程时,您可能会在堆上分配参数,并将该参数作为void *参数传递给CreateThread。最简单的方法是让被调用线程在完成它们的工作时删除它们的参数。但是,如果您遇到内存损坏问题,并且担心一个线程删除另一个创建的内存,也许您应该考虑是否存在双重删除,比如说当前上下文负责清理分配的内存的转移不清晰,或许两个调用段都在处理它?