boehm-gc с библиотекой потоков C++11

Как мы знаем, использование 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();
}

редактировать: вот захват трассировки стека (извините, что это не английский, но я думаю, что это не имеет значения, в любом случае)

и вот отладочное сообщение

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

Во время отладки я обнаружил, что ошибка возникает после fu.get(),

редактировать: ошибка не возникает с /MD(или / MDd)...

(Я думаю, что GC может касаться указателей библиотеки (namespcae Concurrency), но это только предположение;;)

1 ответ

Перед началом использования сборщика и перед созданием потоков убедитесь, что вы выполнили оба

  • GC_INIT, а также
  • GC_allow_register_threads

Тогда в каждой теме следите за этим,

  • GC_get_stack_base/GC_register_my_threadи в конце концов
  • GC_unregister_my_thread,

Вы не сказали, что вы компилируете, но это работает для gcc 4.8 (с -std= C++11).

РЕДАКТИРОВАТЬ: ОП удалось решить проблему, обратившись к инструкции выше и скомпилировав код с /MD[d] флаги для многопоточного динамического времени выполнения MSVCR100. Проблема осталась нерешенной для многопоточной статически скомпилированной среды выполнения.

Другие вопросы по тегам