Многопоточность в Linux

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Многопоточность в Linux

Сообщение qivi » 20.07.2011 23:09:25

Почему при компиляции приложения с дополнительным потоком в Linux я получаю:
Note: DWARF debug information cannot be used with smart linking on this target, switching to static linking


То есть отключается умная компоновка (Проект=>Параметры проекта...=>Параметры компилятора=>Компоновка=>Умная компоновка). Это не допил? Баг? Можно ли рассчитывать что это будет исправлено?

Почему в Linux запуск дополнительного потока приводит к тому что один из процессоров грузиться на 100%!!! а второй идёт на холостом режиме? Это можно как то уравновесить?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Многопоточность в Linux

Сообщение Kitayets » 20.07.2011 23:17:24

какая версия fpc ?

Добавлено спустя 14 минут 7 секунд:
во всяком случае загрузку цпу на 100% не подтверждаю.

fpc - Free Pascal Compiler version 2.4.2 [2011/02/09] for x86_64

система fedora 15 x86_64

вот пара скриншотов с моим тестовым приложением (отрисовка конечно в главном потоке, который в заголовке не учитывается).

Добавлено спустя 6 минут 53 секунды:
на счёт сообщения:
Note: DWARF debug information cannot be used with smart linking on this target, switching to static linking


оно говорит, что при умной компоновке не будет доступна отладка в gdb. Т.е. либо возможность отладки либо смарт линкинг. Таким образом дебажешь программу в статической компоновке а релиз можно сделать и с умной.

Добавлено спустя 3 минуты 6 секунд:
кстати в винде моё приложение, если запустить под 100 потоков, грузит оба ядра core2duo на 100%, а под линуксом пофиг, хоть 2 хоть 200.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: Многопоточность в Linux

Сообщение qivi » 20.07.2011 23:58:05

оно говорит, что при умной компоновке не будет доступна отладка в gdb. Т.е. либо возможность отладки либо смарт линкинг. Таким образом дебажешь программу в статической компоновке а релиз можно сделать и с умной.


Спасибо за подсказку :)

На счёт загрузки процессоров, пронаблюдал подольше, они периодически меняются, видимо это всё таки что то системное (может даже аппаратное):


Хотя скрен не очень удачный, перед тем как его сделал тестил, дак процессоры на продолжительных интервалах поочерёдно грузились под 100.
Последний раз редактировалось qivi 30.01.2012 11:26:24, всего редактировалось 1 раз.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Многопоточность в Linux

Сообщение stikriz » 21.07.2011 12:32:52

Kitayets писал(а):кстати в винде моё приложение, если запустить под 100 потоков, грузит оба ядра core2duo на 100%, а под линуксом пофиг, хоть 2 хоть 200.

У тебя там слипы? Иди диск юзает? Или в порты пишет напрямую? С какого перепуту многопоточное приложение не должно грузить все ядра на 100% пока не выполнить задачу? Должно грузить...
Аватара пользователя
stikriz
энтузиаст
 
Сообщения: 612
Зарегистрирован: 15.03.2006 09:37:47

Re: Многопоточность в Linux

Сообщение qivi » 07.09.2011 21:46:05

Не совсем по теме, но думаю новой темы вопрос не заслуживает.

Обновил под WIN32 Лазарус, главное обновился ФПЦ, и теперь он мне ругается следующим образом:
Код: Выделить всё
gm.pas(1448,12) Warning: Symbol "Resume" is deprecated


То есть "Resume", устарело, а что в замен его?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Многопоточность в Linux

Сообщение Sergei I. Gorelkin » 07.09.2011 22:42:24

В том случае, когда поток создется в остановленном виде, для запуска вместо Resume используется метод Start. В остальных случаях не используется ничего.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Многопоточность в Linux

Сообщение qivi » 07.09.2011 22:57:23

Спасибо.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Многопоточность в Linux

Сообщение qivi » 04.10.2011 17:31:39

А можно ли передать параметр в синхронизируемый метод?
Конструкцию:
Код: Выделить всё
Synchronize(@VIG_MO(n));

паскаль бракует, говорит что вместо второй открывающейся скобки ожидается закрывающая.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Многопоточность в Linux

Сообщение Sergei I. Gorelkin » 04.10.2011 18:18:17

Нельзя туда параметры передавать.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Многопоточность в Linux

Сообщение qivi » 15.10.2011 02:52:49

Ещё один вопросик мучает, может дурацкий, но всё же...
Один дополнительный поток создаёт другой доп поток, синхрометоды последнего будут синхронизироваться с потоком который его создал или с основным потоком приложения?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Многопоточность в Linux

Сообщение VirtUX » 15.10.2011 12:21:14

qivi писал(а):А можно ли передать параметр в синхронизируемый метод?

Определите нужную переменную в том модуле, - из которого вызываете синхронизируемый метод. В методе обрабатывайте эту переменную. Перед вызовом методу в потоке инициалицируйте эту переменную. Главное, чтоб эту переменную не использовали другие потоки, иначе нужно использовать критические секции.
qivi писал(а):синхрометоды последнего будут синхронизироваться с потоком который его создал или с основным потоком приложения?

все методы принадлежат основному потоку, кроме объявленных в классе потока.

Добавлено спустя 1 минуту 46 секунд:
И вообще: синхронизируемые методы должны быть вне каких-либо потоков. Хотя это и не принципиально, но, ИМХО, безопасней.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Многопоточность в Linux

Сообщение qivi » 15.10.2011 15:35:49

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

Спасибо, но там я костыль давно уже подставил. Я только не в модуле объявил переменную, а в классе потока, следовательно к ней получили доступ все методы класса потока включая те что я вызываю на синхронизацию.

все методы принадлежат основному потоку, кроме объявленных в классе потока.

Пардон не понял, если обявление классов обоих доп потоков находится просто в модуле (в разделе имплементатион), а переменную типа второго доп потока я объявляю и вызываю в первом доп потоке, с кем будет синхронизироваться второй доп поток?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Многопоточность в Linux

Сообщение Sergei I. Gorelkin » 15.10.2011 16:15:02

Синхронизация всегда происходит с основным потоком (тем, котовый неявно создается при старте приложения).
Принадлежность методов или свойств не играет никакой роли, любой метод любого класса может быть выполнен в любом потоке.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 259

Рейтинг@Mail.ru