2010-05-12 2 views
3

У меня есть эта странная проблема с некоторыми сторонними DLL. Сторонний поставщик ссылается на некоторые DLL с открытым исходным кодом, которые имеют исключение памяти, когда я пытаюсь использовать определенный метод. Эта проблема не появляется, когда приложение запускается на одной основной машине, но, очевидно, мы не можем предположить, что у пользователя это будет.Принудительное приложение для запуска только одного ядра?

Есть ли способ заставить приложение или еще лучше, но DLL, на которую ссылается, работать на одном ядре? Любой другой способ исправить это? Получение третьей стороны для восстановления OS dll, по-видимому, не может быть и речи (это немного больное место со мной в настоящее время :)), поэтому я должен сам справиться с этим или просто забыть о предоставлении этой функции.

К слову, сообщение об ошибке, выведенное из DLL, является «Попытка получить доступ к поврежденной или защищенной памяти».

+0

Магическое слово, которое вы ищете, это «сродство к процессору» или «сродство потоков». – mquander

+0

http://stackoverflow.com/questions/628057/how-to-set-processor-affinity-on-an-executable-in-windows-xp может помочь –

ответ

4

Что вы хотите сделать, это достигается с помощью Process.ProcessorAffinity. Обратите внимание, что это приведет к тому, что все ваше приложение будет работать одноядерным.

Edit: ваша проблема может быть результатом DLL ожидающей иметь сродство с одним процессором, но она также может быть проблемой нарезание резьбы (например, состояние гонки), что очень маловероятно, чтобы это произошло, когда у вас есть только один ядро. Если последнее верно, вы не можете ничего сделать, кроме скрещивания пальцев и молитвы (и, возможно, подумайте о том, чтобы отказаться от функциональности, чтобы поддерживать стабильное приложение).

+1

Чтобы установить это для одного потока, вам понадобится P/Invoke SetThreadAffinityMask http://msdn.microsoft.com/en-us/library/ms686247(VS.85).aspx. Но это полагается на предположение, что поток .NET строго связан с потоком Win32, который в настоящее время является истинным, но не определяется как всегда быть истинным. – Richard

+0

Также важно отметить, что есть проблема с безопасностью процессора. В коде очень мало вещей, которые мне когда-либо приходилось делать, что заставило меня пойти на устранение проблем с разрешениями, но это один из них. – Toby

+0

Я, честно говоря, не могу в это поверить, но это, видимо, устранило проблему. Где я могу получить крах в 100% случаев, я могу теперь получить крах 0% времени. Очевидно, это далеко не «Стабильный», но это начало. И этот конкретный бит функциональности запрашивается только у нескольких клиентов, которые умирают, чтобы иметь это, и готовы бета-версию для меня, если потребуется. Спасибо. – Kevin

1

Лично я бы отбросил эту функциональность (вы сказали, что это вариант). Многопоточность - очень трогательный предмет, и очевидно, что сторонняя DLL написана не очень хорошо.

Вы говорите, что проблема не возникает, если вы запускаете ее на одном ядре, но не видите проблему, не означает, что у вас нет проблемы (и проблемы с потоками редко встречаются в любом случае), поэтому шансы ваш продукт может терпеть неудачу из-за этого каждый раз в то время.

+0

У меня нет вопросов. – Blindy

0

У меня были некоторые странные проблемы при обращении к DLL, которые были 32-битными, но приложение .NET было построено как 64-разрядное. Поскольку вы упомянули, что это не происходит на одноядерных машинах, я предполагаю, что они 32-разрядные, а многоядерные машины - 64-битные?

Единственное различие заключалось в том, что я получал исключение BadImageFormatException, о котором вы не говорили. Во всяком случае, так, как я решил это, было установить «Платформу» моего приложения на x86, и после этого все сработало.

Смежные вопросы