boehm-gc与C ++ 11的线程库

时间:2014-01-07 09:33:23

标签: c++ c++11 boehm-gc

众所周知,在多线程中使用boehm-gc需要使用GC_register_my_thread的堆栈基调用GC_get_stack_base。但它似乎不适用于C ++ 11的线程库,例如std::thread ...如何将boehm-gc与C ++ 11的线程库一起使用?

(我使用VS2013)

编辑:这是经过测试的代码。 std::thread很好,但std::future不起作用(停在_CrtIsValidHeapPointer

#include <iostream>
#include <thread>
#include <future>

#define GC_THREADS
#include <gc.h>
#include <gc_cpp.h>
#pragma comment(lib, "gcmt-lib")

void foo()
{
    GC_stack_base sb;
    GC_get_stack_base(&sb);
    GC_register_my_thread(&sb);

    int *ptr;
    for (int i = 0; i < 10; i++)
    {
        ptr = new (GC) int;
        *ptr = 1;
    }

    GC_unregister_my_thread();
}

int main()
{
    GC_INIT();
    GC_allow_register_threads();

    std::cout << "test for std::thread";
    std::thread thrd(foo);
    thrd.join();
    std::cout << " [sucs]\n";

    std::cout << "test for std::future";
    std::future<void> fu = std::async(std::launch::async, foo);
    fu.get();
    std::cout << " [sucs]\n";

    std::cin.get();
}

编辑:这里是一个堆栈跟踪的捕获(对不起,它不是英文,但我认为无所谓,无论如何) enter image description here

这是一个调试消息

HEAP[TestGC.exe]: Invalid address specified to RtlValidateHeap( 00E80000, 00C92F80 )

调试时,我发现错误发生在fu.get()之后。

编辑:/ MD(或/ MDd)...

不会发生错误

(我认为GC可能会触及库的指针(namespcae Concurrency),但它只是猜测;;)

1 个答案:

答案 0 :(得分:2)

在开始使用收集器之前,在创建线程之前,请确保同时发出

  • GC_INIT
  • GC_allow_register_threads

然后在每个帖子中跟进,

  • GC_get_stack_base/GC_register_my_thread,最终
  • GC_unregister_my_thread

你没有说你正在编译什么,但它适用于gcc 4.8(使用-std = c ++ 11)。

编辑:OP能够通过解决上述指令并使用多线程动态MSVCR100运行时的/MD[d]标志编译代码来解决该问题。对于多线程静态编译的运行时,问题仍未得到解决。