Как мы знаем, использование 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), но это только предположение ;;)
Перед началом использования сборщика и перед созданием потоков убедитесь, что вы выполнили оба
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. Проблема осталась нерешенной для многопоточной статически скомпилированной среды выполнения.
Других решений пока нет …