LINUX.ORG.RU

Реально ли выполнить метод класса в отдельном потоке?


0

0

Собстно сабж. Нужно из одного метода класса запустить другой, чтобы он работал в отдельном потоке. Это мне нужно чтобы класс выполнял работу и при этом я мог обращаться к остальным его методам. Пытался сделать это через pthread но либо у меня руки кривые либо он отказывается принимать методы класса как аргументы. Вообщем даже не знаю куда копать. Такое впринципе вообще возможно?


Нужно сделать метод, callback на который ты передаешь в pthread, статическим. Одним из параметров в этот метод передавать this. Далее в этом методе вызывать this->method(params).

Kpoxman ★★
()
Ответ на: комментарий от Kpoxman

Большое спасибо! Все работает :)

Virun
() автор топика
Ответ на: комментарий от Kpoxman

> Нужно сделать метод, callback на который ты передаешь в pthread, статическим. Одним из параметров в этот метод передавать this. Далее в этом методе вызывать this->method(params).

зачем так сложно? не проще передать this как аргумент pthread_create и из потока уже вызвать this->my_method()? если нужно вызвать метод с параметрами - заверните их на пару с this в структуру.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

Я, собственно, то же самое и сказал :)

Функцию для потока логично объявлять статическим членом класса, т.к. она к нему отностися.

Kpoxman ★★
()
Ответ на: комментарий от kitov

> Можно было бы boost:thread воспользоваться , там все очень просто .

boost::threads() всем хорош, но есть одно но: через их API нельзя управлять размером стека, который выделяется под создаваемый поток. пока потоков сравнительно мало (десяток-другой) это не есть большая проблема, но если вдруг их становится много (сотни/тысячи) то тут без стека никуда бо банально исчерпывается виртуальное адресное пространство процесса.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

>boost::threads() всем хорош, но есть одно но: через их API нельзя управлять размером стека, который выделяется под создаваемый поток. пока потоков сравнительно мало (десяток-другой) это не есть большая проблема, но если вдруг их становится много (сотни/тысячи) то тут без стека никуда бо банально исчерпывается виртуальное адресное пространство процесса.

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

Sectoid ★★★★★
()
Ответ на: комментарий от alex_custov

> boost::thread нельзя убить, приостановить и продолжить. Уж лучше простой pthread_*.

klalafuda ★☆☆
()
Ответ на: комментарий от alex_custov

> boost::thread нельзя убить, приостановить и продолжить. Уж лучше простой pthread_*.

вы про pthread_cancel()? а оно надо?

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

>>вы про pthread_cancel()? а оно надо?

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

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

> да, часто бывает надо. Простейший пример - перезапуск потока по требованию пользователя программы.

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

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от Virun

> Что то у меня вызывает мало радости использовать такую махину как boost только для тредов. :)

ну вообще-то, это лишь маленький и сравнительно независимый кусочек от boost.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от Virun

boost это не одна библиотека, а много маленьких :)

[root:alex ~]$ apt-cache depends libboost-thread1.33.1
libboost-thread1.33.1
  Зависит: libc6
  Зависит: libgcc1
  Зависит: libstdc++6

[root:alex ~]$ apt-cache show libboost-thread1.33.1 | grep Size
Installed-Size: 104
Size: 33148

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

А-а...я и не знал :) Тогда пощупаемс.

Virun
() автор топика
Ответ на: комментарий от klalafuda

> но если вдруг их становится много (сотни/тысячи) то тут без стека никуда бо банально исчерпывается виртуальное адресное пространство процесса.

Можно вопрос? Зачем нужны тысячи thread'ов? Исполняющих устройств (процов/ядер) на доступном железе будет ну максимум 8. Тысячи thread'ов будут либо все вместе спать (тогда какой смысл их плодить?), либо выполняться одновременно и выпихивать друг друг из L1/L2 кешей...

Почему нельзя писать в небольшое число тредов? Сделайте очередь обработки заданий, и 2*n_cpus thread'ов должно хватить.

gods-little-toy ★★★
()
Ответ на: комментарий от gods-little-toy

> Или вы API пользуетесь cинхронными и эти тысячи тредов висят в этих API и ждут ответов от каких-то удаленных систем?

ну например :) причём изменить используемый синхронный API под асинхронную схему работы возможности нет, исполняемый им запрос может исполняться весьма долго (сложный запрос в базу) и одновременных запросов может быть мягко говоря много (десятки/сотни тысяч).

// wbr

klalafuda ★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.