Чтобы добавлять сообщения и комментарии, .

@hizel:
hizel

fmg.sk все так(

@waterlaz:
waterlaz

Мне нужно, чтобы у каждого потока была своя переменная. Что для этого можно заюзать легкого? Может быть, есть какой-то изящный хак? Про POSIX TLS знаю, но испытываю перед ним суеверный страх.

@USeTi:
USeTi

Пишу кросплатформенную тулзу, которой нужно довольно шустро в несколько потоков дробить числа. Смотрю на бустовские threads. Плюсы, минусы, подводные камни ?

@syjgin:
syjgin

Жаль, что основная масса гуру, встреченных мной(в смысле, гуру для меня, а не вообще — объективно вполне могут быть несчастными замороченными людьми, но в данный момент моей жизни их перекосы для меня как указатели) была другого пола и была встречена в тот момент, когда эмоциональный слот "девушка" пустовал. Это приводило к тому, что нормальный интерес к иначе развивающемуся существу трансформировался во влюбленность — тоже, конечно, хороший предлог для обучения умению жить иначе, но уж больно много side effects. Вот и сейчас. По хорошему, надо бы всё осмыслить и разложить по полочкам, а я испытываю бессмысленную радость от факта чужого существования

@dr-Chaos:
dr-Chaos

Хозяйке на заметку:
В многопоточной среде конструктор неглобального статического объекта может быть вызван несколько раз. Отсюда вывод: так можно безопасно инициализировать только atomic переменную.

@sss:
sss

не работают слоты/сигналы на объектах которые movetothread() кто то сталкивался ?

@sss:
sss

labs.qt.nokia.com

@rb:
rb

Почему у меня данный код выполняется два раза?

require 'threads'
paths = ["1","2","3"]
count = 0
paths.each{ |path|
count += 1
Thread.fork(path){ |url| sleep rand; p url }.join
}
p count

На выходе я получаю результат, как будто программу два раза запустил.

@beardog-ukr:
beardog-ukr

Говорят, что обьект (QObject) "живет" в потоке (QThread), если он был создан после того, как метод run() начал выполнятся.
Дополнительное условие для основного потока приложения: обьект считается живущим в потоке только если он был создан после
создания экземпляра QCoreApplication. Обьекты, созданные до этого момента, не живут ни в каком потоке (типа бомжи, хихи).

У каждого потока есть свой event loop, который запускается методом QThread::exec(). Event loop основного потока приложения
запускается QCoreApplication::exec().

особенности жизни:
— Дочерний обьект (child) должен жить в том же потоке, что и родительский (parent)
— Некоторые обьекты могут использоваться только в том потоке, в котором они живут. Например, запустить QTimer (start()),
можно только из его родного потока. Еще в качестве примера в документации упоминаются сокеты
— Документация требует, чтобы обьекты, которые живут в потоке, были удалены перед удалением потока
— Удалять (delete) обьект желательно только из того потока, в котором он живет. Иначе возможно, что вы удалите обьект в том
момент, когда он обрабатывает какой-нибудь слот или событие (event).
— обьект может обрабатывать слоты и посылать сигналы только когда в том потоке, где он живет, крутится event loop (т.е.
пока исполняется exec())

Важно: сам по себе обьект QThread живет в том потоке, где вы его создали; все обьекты, которые создаются в конструкторе
этого потока тоже живут в текущем потоке. Поэтому нельзя назначить поток родителем для обьектов, созданных в внутри run():
будет ошибка вроде
QObject: Cannot create children for a parent that is in a different thread.
(Parent is TimerThread(0xbfd66954), parent's thread is QThread(0x946e338), current thread is TimerThread(0xbfd66954)

Еще пример: обьект QTimer будет живет в одном потоке, а вы пытаетесь запустить его из другого. Получите
QObject::startTimer: timers cannot be started from another thread

Важно: для того, чтобы сигналы-слоты работали, совершенно не обязятельно запускать QCoreApplication::exec(); необходимо и
достаточно, чтобы выполнялся exec() того потока, в котором живут обьекты.

Обьект можно переместить (сменить прописку, хихи) из одного потока в другой, используя метод QObject::moveToThread().

Если обьекты, сигналы-слоты которых соединены, живут в разных потоках, при возникновении сигнала связь все равно сработает
(естественно, если event loop действует в обоих потоках). Пятый параметр функции connect() определяет только когда именно
произойдет это соединение и где оно будет выполнено (т.е. где будут жить обьекты, созданные в слоте).

Пруфлинк: doc.qt.nokia.com

@itakingiteasy:
itakingiteasy

скелет многотредового шеллскрипта
paste2.org