Русский / Russian English / Английский

Сейчас на форуме: Medsft (+5 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Программирование —› Потоконебезопасная библиотека и многопоточное приложение
Посл.ответ Сообщение


Ранг: 213.9 (наставник)
Статус: Участник
X-Literator

Создано: 18 марта 2016 23:49 New!
Цитата · Личное сообщение · #1

Привет, ребята.

Ситуация. Есть библиотека (статическая - lib), написанная на Си, которая потокоНЕбезопасна. Кроме того, есть приложение, которое должно в потоках вызывать один метод этого приложения.

Код библиотеки есть, но библиотека коммерческая и достаточно обширная, поэтому править ее очень не хотелось бы - работы на месяцы.

Как вы считаете, какие есть выходы, чтобы совершать потокобезопасные вызовы метода?

- Можно сделать много процессов, но пострадает быстродействие


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

Спасибо заранее.


Ранг: 335.3 (мудрец)
Статус: Участник
born to be evil

Создано: 19 марта 2016 00:27 · Поправил: 19 марта 2016 00:27 ajax New!
Цитата · Личное сообщение · #2

"обертки" сделать вида
Code:
  1. lea     rcx, CriticalSection
  2. call    EnterCriticalSection
  3. call    required_proc
  4. lea     rcx, CriticalSection
  5. call    LeaveCriticalSection


Ранг: 2011.5 (!!!!)
Статус: Модератор
retired

Создано: 19 марта 2016 00:27 · Поправил: 19 марта 2016 00:28 Модератор New!
Цитата · Личное сообщение · #3

Зачем процессов много? Воткнуть критическую секцию на вызов метода, не?
З.Ы. Опередили.


Ранг: 213.9 (наставник)
Статус: Участник
X-Literator

Создано: 19 марта 2016 01:04 New!
Цитата · Личное сообщение · #4

ajax, Archer, метод довольно долго обрабатывает данные (порядка 10-15 секунд). Я это не упомянул, но это может стать препятствием (наверное?).


Ранг: 2011.5 (!!!!)
Статус: Модератор
retired

Создано: 19 марта 2016 01:21 New!
Цитата · Личное сообщение · #5

Ну пока 1 поток считает, остальные будут ждать. В чём препятствие-то? Зато потокобезопасно.
Либо разные процессы, будут потоки работать параллельно.
Либо переписывать либу, чтоб потоки работали параллельно без проблем.

Ранг: 71.2 (постоянный)
Статус: Участник

Создано: 19 марта 2016 01:44 New!
Цитата · Личное сообщение · #6

Еще можно наделать несколько копий этой либы в виде DLL.


Ранг: 323.3 (мудрец)
Статус: Участник

Создано: 19 марта 2016 02:04 New!
Цитата · Личное сообщение · #7

Crawler
А вызываются из методов какие-нибудь апи? Если много общих вызовов, то можно хукнуть функи и обернуть в крит.секции )

Добавлено спустя 1 минуту
Хотя не вариант, если используются глобальные переменные внутри


Ранг: 213.9 (наставник)
Статус: Участник
X-Literator

Создано: 19 марта 2016 02:17 New!
Цитата · Личное сообщение · #8

Archer, да, будет потокобезопасно. Жаль, пострадает производительность - смысл как раз был в том, чтобы использовать несколько потоков.

Пока оставлю тему открытой, напишу, какое нашлось решение.


Ранг: 335.3 (мудрец)
Статус: Участник
born to be evil

Создано: 19 марта 2016 08:19 New!
Цитата · Личное сообщение · #9

Crawler
несколько мини-exe, с запуском на конкретное ядро. больше пока мыслей нет


Ранг: 990.3 (! ! !)
Статус: Модератор
Author of DiE

Создано: 19 марта 2016 11:42 New!
Цитата · Личное сообщение · #10

а если вручную несколько раз загрузить либу в свое АП? по разной базе 1 либа = 1 поток.
хотя смысл сомнителен, можно и мини-ехе запилить в нужном количестве.
 eXeL@B —› Программирование —› Потоконебезопасная библиотека и многопоточное приложение

Видеокурс ВЗЛОМ