многопоточность в небезопасной среде

В моей программе на C ++ я использую библиотеку proprietarry (.dll), которая не является потокобезопасной. :-(

В этой библиотеке есть конкретные научные вычисления.

Есть ли способ безопасности начать несколько вычислений этой библиотеки параллельно с потоками? (1 процесс, много потоков)

Моя программа «похожа» на цикл «за», на который вызывается каждый раз, когда вычисляет мою небезобезопасную библиотеку

0
nl ja de
Да: синхронизировать все самостоятельно.
добавлено автор Kerrek SB, источник
Синхронизация гарантирует правильное выполнение, но не создает параллелизма, который OP хочет видеть.
добавлено автор minjang, источник
@scanpat: «синхронизировать все самостоятельно» означает иметь большой старый мьютекс, который вы держите при использовании библиотеки. Вероятно, это не совсем то, что вы хотите, когда попросите «несколько вычислений этой библиотеки параллельно с потоками». Только один из ваших потоков будет удерживать мьютексы в любой момент времени, поэтому это не является параллельным использованием библиотеки. Если «сама библиотека» является потокобезопасной, но в ней есть отдельные классы/структуры, которые небезопасны, тогда вы можете синхронизировать эти структуры. Но я предполагаю, что «библиотека не является потокобезопасной», вы имеете в виду, что она имеет небезопасное глобальное состояние.
добавлено автор Steve Jessop, источник
Большинство библиотек в настоящее время являются потокобезопасными в том смысле, что вы можете одновременно запускать несколько экземпляров. Например: большинство реализаций STL. Взгляните на это обсуждение об этом sgi.com/tech/stl/thread_safety.html . Однако это трудно понять, не глядя на фактический код.
Что вы имеете в виду ?
добавлено автор scanpat, источник
Избегайте взаимоблокировки по дизайну.
добавлено автор David Ruan, источник

2 ответы

Похоже, вы хотите загрузить DLL несколько раз. Взгляните на Загрузите одну и ту же DLL несколько раз .

2
добавлено
На самом деле это довольно крутая идея (хотя и не тривиальная).
добавлено автор Damon, источник
Да, это то, что я имею в виду под «не тривиальным». Копирование файлов вокруг ... meh. Но, к несчастью, другого пути нет, так как загрузка DLL дважды в противном случае приведет только к увеличению количества ссылок. Интересно, работает ли это, если вы просто создаете соединение, хотя ... технически, что есть другое имя, и ему не нужно ничего копировать.
добавлено автор Damon, источник
Я сам этого не сделал, но если вы будете следовать рекомендациям «копировать DLL во временный файл», это не должно быть слишком сложно.
добавлено автор mkluwe, источник

Очень простой подход заключается в том, чтобы развернуть несколько подчиненных процессов в цикле для . Ведомый процесс загружает модуль, не являющийся потоком, и выполняет вычисления, и, наконец, возвращает результат в родительский процесс через простой код возврата (если результат вписывается в 4 байта), IPC или файл.

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

1
добавлено
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest