VC ++本机互斥堆损坏

时间:2014-12-15 05:32:57

标签: visual-c++ mutex heap-corruption

我有一个托管C ++应用程序使用的本机c ++库。本机库是在没有CLR支持的情况下编译的,也是带有它的托管C ++应用程序(/ CLR编译器选项)。

当我在本机库中使用std :: mutex时,删除拥有的本机类时会出现堆损坏。托管C ++阻止了mutex.h的使用,所以我猜这可能是原因的一部分。

演示此问题的最小本机类是:

部首:

#pragma once

#include <stdio.h>

#ifndef __cplusplus_cli
#include <mutex>
#endif

namespace MyNamespace {

    class SomeNativeLibrary
    {
    public:
        SomeNativeLibrary();
        ~SomeNativeLibrary();
        void DoSomething();

#ifndef __cplusplus_cli
        std::mutex aMutex;
#endif

    };
}

实现:

#include "SomeNativeLibrary.h"

namespace MyNamespace {
    SomeNativeLibrary::SomeNativeLibrary()
    {}

    SomeNativeLibrary::~SomeNativeLibrary()
    {}

    void SomeNativeLibrary::DoSomething(){
        printf("I did something.\n");
    }
}

托管C ++控制台应用程序:

int main(array<System::String ^> ^args)
{
    Console::WriteLine(L"Unit Test Console:");

    MyNamespace::SomeNativeLibrary *someNativelib = new MyNamespace::SomeNativeLibrary();
    someNativelib->DoSomething();
    delete someNativelib;

    getchar();

    return 0;
}

尝试删除someNativeLib指针时发生堆损坏调试错误。

我可以做些什么来安全地在本机库中使用std :: mutex,或者我可以使用替代方案吗?在我的实时代码中,互斥体用于确保只有一个线程访问std :: vector。

1 个答案:

答案 0 :(得分:0)

解决方案是使用CRITICAL_SECTION作为锁。它实际上比我的情况下的互斥锁效率更高,因为锁只适用于同一进程中的线程。