повысить проблемы мьютекса в C ++ / CLI - PullRequest
12 голосов
/ 15 апреля 2011

Я занимаюсь разработкой в ​​Visual Studio 2008 C # для 64 бит и хочу использовать библиотеку, которая использует boost.Поэтому я написал оболочку на C ++ / CLI.Мне удалось указать на полученную ошибку:

#include <boost/thread/mutex.hpp>.

Если я включаю какой-либо файл в свою оболочку C ++ / CLI, который сам по себе включает <boost/thread/mutex.hpp>, или если я включаю его непосредственно в оболочку, я получаю.AccessViolationException "" Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена. "Когда я использую ту же библиотеку в 64-битной версии в «простом» C ++, все работает нормально.Я прочитал пару постов, в которых люди, похоже, имеют схожие проблемы с потоками повышения, но ни одно из найденных решений не сработало.У кого-нибудь есть идея?

Ответы [ 3 ]

8 голосов
/ 15 апреля 2011

Проблема заключается в том, что boost.thread использует некоторые директивы #pragma section, которые несовместимы при сборке без / clr, а затем статически связаны с кодом, использующим /clr.

Я слышал, что восстановление boost.thread с/ clr (т. е. передача cxxflags="/clr" при вызове bjam) устраняет проблему, но я не пробовал лично.

Я предполагаю, что динамическое связывание с boost.thread (а не статически, как по умолчанию)для VC ++; #define BOOST_THREAD_DYN_LINK перед включением любых заголовков наддува) тоже должно работать, но, опять же, я не пробовал.

Если это не сработает, попробуйте поискать в Google комбинацию boost thread clr tls;вы должны найти немало сообщений в списке рассылки Boost об этом, так как это старая проблема.


РЕДАКТИРОВАТЬ : Как прокомментировано здесь Раман Шарма (старший менеджер Microsoft), даже std::mutex не поддерживается с / clr, поэтому неудивительно, что мьютексная реализация boost.thread также не поддерживается.

2 голосов
/ 05 июня 2011

Как говорится в другом ответе, прагмы boost в tss_pe.cpp несовместимы с CLR. Простая модификация этого файла устраняет проблему и допускает статическое связывание. Моя модифицированная версия для Boost 1.44 - здесь (разница против это для внесенных изменений).

0 голосов
/ 06 сентября 2017

Некоторые библиотеки Boost не должны быть статически связаны с кодом CLI C ++, иначе компилятор может создать несовместимый образ для некоторых версий Windows. Насколько мне известно, мне было трудно разобраться в проблеме при статическом построении с библиотекой потоков Boost 1.64 x86 с VC ++ 2017 под windows 10. Двоичный файл работал нормально в Windows 10, но вызвал System.BadImageFormatException в Windows 7. Проблема была обнаружена в библиотеке потоков Boost, которую я изначально статически связывал со своей сборкой CLI C ++.

Вот краткий код, который легко воспроизводит проблему:

testcli.h - C ++ CLI сборки НЕИСПРАВНОСТЬ код

#pragma comment(lib, "libboost_thread-vc141-mt-1_64.lib") // static link makes the program crash under W7

namespace testcli
{
    public ref class TestClass { public: static void Test(){} };
}

Program.cs - загрузка кода клиента C # 'testcli'

using testcli;

namespace Cli
{
    class Program { static void Main(string[] args) { new TestClass(); } } // instanciate C++ CLI Boost class 
}

Приведенный выше код возвращает значение System.BadImageFormatException (исключение можно найти в средстве просмотра событий приложения).

Если testcli изменен, и библиотека потоков Boost теперь связана динамически:

testcli.h - сборка C ++ CLI УСПЕШНЫЙ код

#pragma comment(lib, "boost_thread-vc141-mt-1_64.lib") // dynamic link works fine under any Windows

namespace testcli
{
    public ref class TestClass { public: static void Test(){} };
}

Код теперь успешно возвращается.

Обратите внимание, что вы можете определить BOOST_THREAD_DYN_LINK вместо BOOST_ALL_DYN_LINK, как описано здесь: http://www.boost.org/doc/libs/1_64_0/doc/html/thread/build.html

Для этого вам не придется упаковывать все динамические библиотеки Boost с вашим приложением.

...