Re[5]: Линкование либы в несколько потоков одного процесса.
От: c-smile Канада http://terrainformatica.com
Дата: 08.12.13 03:09
Оценка: 1 (1) +1
W>>А что конкретно глупого?
X>зачем рекомендовать создавать процессы?

Например затем же для чего Goggle Chrome создает по процессу на вкладку.

X>а вообще, сдается мне, ТС совершенно не понимает сабжа...


По мне так совершенно адекватный ответ. Бывают ситуации когда совершенно адекватно завернуть библиотеку не поддерживющую многопоточность в отдельный процесс.
Иногда это единственная разумная опция. Понятно что процесс имеет penalty fee в виде overhead всего и вся.
Re[6]: Линкование либы в несколько потоков одного процесса.
От: niXman Ниоткуда https://github.com/niXman
Дата: 08.12.13 10:17
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Например затем же для чего Goggle Chrome создает по процессу на вкладку.

оно это делает не столько для того чтоб увеличить увеличить озывчивость браузера, сколько ради надежности.

CS>По мне так совершенно адекватный ответ. Бывают ситуации когда совершенно адекватно завернуть библиотеку не поддерживющую многопоточность в отдельный процесс.

приведите пример такой ситуации, пожалуйста.
и еще, пожалуйста, приведите пример того, почему какая-то библиотека не поддерживает многопоточность, и что означает "не поддерживает многопоточность".
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[7]: Линкование либы в несколько потоков одного процесса.
От: Сергей Мухин Россия  
Дата: 08.12.13 10:43
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, c-smile, Вы писали:


CS>>Например затем же для чего Goggle Chrome создает по процессу на вкладку.

X>оно это делает не столько для того чтоб увеличить увеличить озывчивость браузера, сколько ради надежности.

так мне кажется мы тоже хотим что бы программа работала надежно и не повисала?

CS>>По мне так совершенно адекватный ответ. Бывают ситуации когда совершенно адекватно завернуть библиотеку не поддерживющую многопоточность в отдельный процесс.

X>приведите пример такой ситуации, пожалуйста.

X>и что означает "не поддерживает многопоточность".


если Вы этого не знаете, зачем отвечаете в этой теме?
---
С уважением,
Сергей Мухин
Re[8]: Линкование либы в несколько потоков одного процесса.
От: niXman Ниоткуда https://github.com/niXman
Дата: 08.12.13 10:57
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>так мне кажется мы тоже хотим что бы программа работала надежно и не повисала?

так вы считаете, что потоки только способствуют ненадежности и подвисанию?
да, действительно, для чего эти потоки придумали? — процессы рулят! </sarcastic>

СМ>если Вы этого не знаете, зачем отвечаете в этой теме?

глупый вброс.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: Линкование либы в несколько потоков одного процесса.
От: uzhas Ниоткуда  
Дата: 08.12.13 14:58
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Если есть уверенность, что программа помирает именно внутри LibTomCrypt'а, попробуйте OpenSSL. За ним вроде не замечены никакие придури, связанные с многопоточностью.


ну я бы так не сказал про openssl, там довольно все нетривиально с многопоточностью
http://rt.openssl.org/Ticket/Display.html?id=2891&amp;user=guest&amp;pass=guest
http://stackoverflow.com/questions/3417706/openssl-and-multi-threads
Re[7]: Линкование либы в несколько потоков одного процесса.
От: squid_etc  
Дата: 08.12.13 18:30
Оценка:
Здравствуйте, niXman, Вы писали:

X>и еще, пожалуйста, приведите пример того, почему какая-то библиотека не поддерживает многопоточность, и что означает "не поддерживает многопоточность".


не сорьтесь!

пример могу привести я, хотя с таким в реале не сталкивался: либа может не поддерживать многопоточность, когда несколько потоков вызывают один и тот же метод либы — а внутри этого метода используются общие данные не защищенные критической секцией... вуаля — студенческий баг
Re[4]: Линкование либы в несколько потоков одного процесса.
От: squid_etc  
Дата: 08.12.13 20:04
Оценка:
Здравствуйте, Pzz, Вы писали:
Pzz>Непонятно, с чего бы. Казалось бы, если процессор загружен, то он что-то делает, и результаты этой деятельности должны быть как-то видны.

Pzz>Может, если потоки не привязаны к ядру, то измерялка загрузки глючит?


"измерялка" == таск менеджер )))
если отвязать потоки от ядер загрузка 13-15%, если привязать 95-100% (это один процесс ест столько)
Re[3]: Линкование либы в несколько потоков одного процесса.
От: squid_etc  
Дата: 08.12.13 20:12
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Тем более, замораживание. Странно это всё. Может, программа собрана с однопоточным рантаймом? (Безумное предположение, и его стоит исключить с самого начала).

если вы о "Multi-Threaded DLL" — то в эти настройки я не лез — и они не менялись.

я грешу на корявенький рукодельный(не мной) пул потоков. -руки еще не дошли поправить
Re[5]: Линкование либы в несколько потоков одного процесса.
От: Pzz Россия https://github.com/alexpevzner
Дата: 10.12.13 10:27
Оценка:
Здравствуйте, squid_etc, Вы писали:

_>"измерялка" == таск менеджер )))

_>если отвязать потоки от ядер загрузка 13-15%, если привязать 95-100% (это один процесс ест столько)

Возможно, таск менеджер измеряет загрузку каждого из ядер, а потом берет максимум. Тогда если какой-то поток крутится в цикле на одном ядре, загрузка будет около 100%, а если прыгает по ядрам, то около 100%/N, где N — количество ядер. Разумеется, о реальной загрузке системы такая цифра мало чего говорит.
Re[9]: Линкование либы в несколько потоков одного процесса.
От: skeptic  
Дата: 10.12.13 15:46
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, Сергей Мухин, Вы писали:


СМ>>так мне кажется мы тоже хотим что бы программа работала надежно и не повисала?

X>так вы считаете, что потоки только способствуют ненадежности и подвисанию?

А что, уже отменили гонки и дедлоки?
Как-то я пропустил видимо...
Re[6]: Линкование либы в несколько потоков одного процесса.
От: Pavel Dvorkin Россия  
Дата: 10.12.13 15:59
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Возможно, таск менеджер измеряет загрузку каждого из ядер, а потом берет максимум. Тогда если какой-то поток крутится в цикле на одном ядре, загрузка будет около 100%, а если прыгает по ядрам, то около 100%/N, где N — количество ядер.


Не думаю. Впрочем, проверить просто : Task manager — Perfomance и смотри на графики по ядрам.
With best regards
Pavel Dvorkin
Re[2]: а если так ?
От: Pavel Dvorkin Россия  
Дата: 10.12.13 16:14
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>либа (как Вы это называете) лежит в памяти и принадлежит процессу, а не потоку. Поэтому, если нигде в ее описании не объявлено, что она thread-safe, то использовать ее в разных thread нельзя.


Интересно, а если так ?

Делаем свою static library, экспонирующую те же функции, что и исходная, только с неким префиксом в имени. Функции просто вызывают соответствующие функции исходной library

Например, в исходной library


int sum(int x, int y)

А мы делаем


int my1sum(int z, int y)
{
  return sum(x,y);
}



Делаем еще одну свою static library, экспонирующую те же функции, что и исходная, только с неким другим префиксом в имени. (в ней будет my2sum)

Итого имеем две статические library, а к ним статически прилинкованы 2 копии исходной library.

Теперь делаем EXE, к нему линкуем наши обе библиотеки. В своей программе вызываем в одном потоке my1sum, а в другом my2sum.

По идее вызов mysum1 пойдет в первую копию, а mysum2 — во вторую. А мешать они друг другу не должны, так как можно считать, что это две разные библиотеки. И thread-safe не должно быть существенным, так как это разные библиотеки.

Я нигде не ошибся ?
With best regards
Pavel Dvorkin
Re[7]: Линкование либы в несколько потоков одного процесса.
От: Pzz Россия https://github.com/alexpevzner
Дата: 10.12.13 16:20
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Не думаю. Впрочем, проверить просто : Task manager — Perfomance и смотри на графики по ядрам.


Кому просто, а кому для этого венду придется ставить

Я не могу придумать никакого другого объяснения, почему привязка вычислительного потока к ядру может так повлиять на загрузку.
Re[8]: Линкование либы в несколько потоков одного процесса.
От: Pavel Dvorkin Россия  
Дата: 10.12.13 16:38
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Кому просто, а кому для этого венду придется ставить


Ну ТС-то несложно. У него там аж 24 ядра. Интересно было бы посмотреть на картинку Task Manager с 24 ядрами — как он там их нарисовал

Pzz>Я не могу придумать никакого другого объяснения, почему привязка вычислительного потока к ядру может так повлиять на загрузку.


Я тоже, но я сомневаюсь, в том, что это имеет место. Вообще-то игры с affinity mask обычно мало на что влияют при одном потоке. Когда-то проверял (в надежде получить именно ускорение за счет того, что сохраняется кеш при переключении) , получил 0).
With best regards
Pavel Dvorkin
Re[9]: Линкование либы в несколько потоков одного процесса.
От: Pzz Россия https://github.com/alexpevzner
Дата: 10.12.13 17:30
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Я тоже, но я сомневаюсь, в том, что это имеет место. Вообще-то игры с affinity mask обычно мало на что влияют при одном потоке. Когда-то проверял (в надежде получить именно ускорение за счет того, что сохраняется кеш при переключении) , получил 0).


Я думаю, при умеренной нагрузке системе хватает ума не дергать считающий поток по ядрам. По крайней мере, делать это не слишком часто. А вот при большой нагрузке у нее уже может не остаться выбора.
Re[3]: а если так ?
От: Сергей Мухин Россия  
Дата: 10.12.13 17:37
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, Сергей Мухин, Вы писали:


СМ>>либа (как Вы это называете) лежит в памяти и принадлежит процессу, а не потоку. Поэтому, если нигде в ее описании не объявлено, что она thread-safe, то использовать ее в разных thread нельзя.


PD>Интересно, а если так ?


PD>Делаем свою static library, экспонирующую те же функции, что и исходная, только с неким префиксом в имени. Функции просто вызывают соответствующие функции исходной library


PD>Например, в исходной library



PD>
PD>int sum(int x, int y)
PD>

PD>А мы делаем


PD>
PD>int my1sum(int z, int y)
PD>{
PD>  return sum(x,y);
PD>}
PD>



PD>Делаем еще одну свою static library, экспонирующую те же функции, что и исходная, только с неким другим префиксом в имени. (в ней будет my2sum)


PD>Итого имеем две статические library, а к ним статически прилинкованы 2 копии исходной library.


PD>Теперь делаем EXE, к нему линкуем наши обе библиотеки. В своей программе вызываем в одном потоке my1sum, а в другом my2sum.


PD>По идее вызов mysum1 пойдет в первую копию, а mysum2 — во вторую. А мешать они друг другу не должны, так как можно считать, что это две разные библиотеки. И thread-safe не должно быть существенным, так как это разные библиотеки.


PD>Я нигде не ошибся ?





Если в будет вызываться старая либа внутри, то от проблемы не ушли. Если будет полная копия библиотеки, то у нас только два thread! и как вызывать? Все время проверять н омер thread?
---
С уважением,
Сергей Мухин
Re[4]: а если так ?
От: Pavel Dvorkin Россия  
Дата: 10.12.13 17:58
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:


СМ>Если в будет вызываться старая либа внутри, то от проблемы не ушли.


Нет, я же говорил, статически линковать старую либу. Ее больше нет в EXE-проекте, она скрыта внутри wrapper-либы.


>Если будет полная копия библиотеки, то у нас только два thread! и как вызывать? Все время проверять н омер thread?


Не обязательно. Взять в самом начале указатели на функции и в tls их.

Я не говорю, что решение идеально. Просто прочитал твое сообщение и подумал — нельзя ли что-то придумать. Задача показалась интересной. Думал минут 10
With best regards
Pavel Dvorkin
Re[5]: а если так ?
От: Сергей Мухин Россия  
Дата: 10.12.13 18:04
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, Сергей Мухин, Вы писали:


СМ>>Если в будет вызываться старая либа внутри, то от проблемы не ушли.


PD>Нет, я же говорил, статически линковать старую либу. Ее больше нет в EXE-проекте, она скрыта внутри wrapper-либы.


что такое "EXE проект" в терминах выполнимых файлов? Есть Exe и DLL где библиотека? А где бы ни была, либо одна копия, либо несколько в разных выполнимых модулях.
Соответственно ничего не поменялось.


>>Если будет полная копия библиотеки, то у нас только два thread! и как вызывать? Все время проверять н омер thread?


PD>Не обязательно. Взять в самом начале указатели на функции и в tls их.


Ну и как? там мб 1000 ф-ий и их все придется описать заново и проинициализировать указатели в tls ? Но как мы будем инициализировать указатели? т.е. не то.

PD>Я не говорю, что решение идеально. Просто прочитал твое сообщение и подумал — нельзя ли что-то придумать. Задача показалась интересной. Думал минут 10


имхо это совсем не решение.
---
С уважением,
Сергей Мухин
Re[6]: а если так ?
От: Pavel Dvorkin Россия  
Дата: 11.12.13 03:22
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:


PD>>Нет, я же говорил, статически линковать старую либу. Ее больше нет в EXE-проекте, она скрыта внутри wrapper-либы.


СМ>что такое "EXE проект" в терминах выполнимых файлов?


EXE-проект — это проект VS, в котором собирается EXE.

>Есть Exe и DLL где библиотека?


Ни о каких DLL и речи тут не было. Речь идет о статической библиотеке.


>А где бы ни была, либо одна копия, либо несколько в разных выполнимых модулях.


И модуль тут один — EXE.

СМ>Соответственно ничего не поменялось.


Подумай еще раз.


>>>Если будет полная копия библиотеки, то у нас только два thread! и как вызывать? Все время проверять н омер thread?


PD>>Не обязательно. Взять в самом начале указатели на функции и в tls их.


СМ>Ну и как? там мб 1000 ф-ий и их все придется описать заново и проинициализировать указатели в tls ? Но как мы будем инициализировать указатели? т.е. не то.



Элементарно. Создадим потоки и в самом начале функции потока проинициализируем. Как и все tls-переменные.



PD>>Я не говорю, что решение идеально. Просто прочитал твое сообщение и подумал — нельзя ли что-то придумать. Задача показалась интересной. Думал минут 10


СМ>имхо это совсем не решение.


Твое право так считать, но хотелось бы серьезных аргументов.
With best regards
Pavel Dvorkin
Re[7]: а если так ?
От: Сергей Мухин Россия  
Дата: 11.12.13 04:43
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:


СМ>>что такое "EXE проект" в терминах выполнимых файлов?


PD>EXE-проект — это проект VS, в котором собирается EXE.


т.е. никакого отношение к выполнению не имеет. имеет отношение к построению. И тогда нет там либы или есть — монопенициально.


PD>Подумай еще раз.

что тут думать — трясти надо


PD>Элементарно. Создадим потоки и в самом начале функции потока проинициализируем. Как и все tls-переменные.




PD>>>Я не говорю, что решение идеально. Просто прочитал твое сообщение и подумал — нельзя ли что-то придумать. Задача показалась интересной. Думал минут 10


СМ>>имхо это совсем не решение.


PD>Твое право так считать, но хотелось бы серьезных аргументов.


может я не понимаю что предлагается, но я вижу, что код функций из библиотеки содержится один раз во всем процессе. Это так?
Если да, то какие обертки не делай, код будет выполняться один.
Допустим, что в библиотеке одна ф-я ZZZ и её нельзя вызывать из разных потоков. Какие обертки над ней делай, её придётся вызвать! Соответственно или надо синхронихировать её вызов, и тогда о multithread забываем или приехали!

Если код дублируется, то непонятен механизм дублирования (если нет исходных текстов). И все равно могут быть проблемы, но уже из-за того, что библиотеки часто не приспособлены, иметь два кода в одном адресном пространстве.
---
С уважением,
Сергей Мухин
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.