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(),

edit: ошибка не возникает с / MD (или / MDd) …

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

3

Решение

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

  • 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. Проблема осталась нерешенной для многопоточной статически скомпилированной среды выполнения.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]