Здравствуйте, гость ( Вход | Регистрация )
Iron Bug | Дата 18.6.2014, 7:55 |
да, он там не нужен. видимо, просто остался от правки какого-то другого кода. | |
lanz | Дата 17.6.2014, 23:39 |
А у меня вопрос по этому кусочку:
Зачем здесь захватывается pfoo? Оно же и так скопируется при вызове лямбды? |
|
Iron Bug | Дата 25.10.2013, 20:26 |
и ещё, кстати, про потоки и функции: может, тебе стоит посмотреть на библиотечку <future>, в частности на std::async? штука полезная. по-моему, как раз очень близко к тому, что ты пытается реализовать. | |
Iron Bug | Дата 25.10.2013, 17:27 |
именно bind ничего особенного не делает. это свойство shared_ptr - увеличивать счётчик при передаче в любую функцию. поэтому bind тут просто выступает в роли функтора, в котором есть shared_ptr. когда функтор отрабатывает и уничтожается - освобождается и shared_ptr. если бы там был обычный указатель - он бы рухнул при вызове в потоке. а насчёт boost: я его использую, кажется, с 31-й версии (если я правильно помню). так что для меня это уже почти что десять лет практики и я привыкла его использовать везде. так как boost - не просто библиотека, а испытательный полигон стандартизации С++, то почти все разработки boost потом переходят в стандарт. насчёт сборки с потоками: вообще, GCC принимает опцию -pthread (не -lpthread!), которая определена как -D_REENTRANT -lpthread. либо добавь её, либо определение реентерабельных функций. в старых компиляторах библиотеки и сорцы иногда ещё нужно было указывать в обязательно строгом порядке. попробуй указать линковку после сорца. как-то так:
но обычно для простых сорцов порядок сборки не так уж важен. |
|
alexy | Дата 24.10.2013, 22:16 |
под чем собираешь? с какими опциями? иногда у конкретных версий-систем бывают разные особенности. ну и сторонние библиотеки можно по-разному собирать. g++ . А какие сторонние библиотеки? это было только std.. Раскрывающийся текст
если например (это твой код из последнего поста, с потоками из std) сказать то собиреться, а если то не собереться... ерунда какая-то. вот выхлоп
bind ничего не делает сам. существование объектов должен обеспечить программист. на этот раз не стала писать по старой привычке, через boost , сделала всё через std. хотя я не сравнивала скорость реализаций. это ещё открытый вопрос. ну да.. сам ничего не далет)) я про деструктор говорил. этот код ответил на вопрос да, скорость не знаю.. но мне кажется std как бы родной . хотя например upgradable мутекса там нету, а нужен.. |
|
Iron Bug | Дата 24.10.2013, 20:53 |
а std::bind я так понимаю уничтожает привязанные боъекты тогда, когда уничтожается объект, возращаенной это функцией, так? bind ничего не делает сам. существование объектов должен обеспечить программист. то есть, если ты передал в bind какой-то объект, то он должен существовать во время вызова полученного функтора. shared_ptr при связывании увеличит счётчик и объект не уничтожится, пока вызов не пройдёт. вот пример передачи shared_ptr в bind, с потоками: Раскрывающийся текст
на этот раз не стала писать по старой привычке, через boost , сделала всё через std. хотя я не сравнивала скорость реализаций. это ещё открытый вопрос. |
|
Iron Bug | Дата 24.10.2013, 18:23 |
объект в shared_ptr уничтожается когда завершаются потоки его использующие. да, тут я детали забыла. впрочем, я всегда явно выделяю память и освобождаю. привычка к аккуратному использованию кучи. видимо, со старых времён осталась такая привычка. проверяю обязательно, что память не утекает, даже у больших приложений на многодневных прогонах. зы: почему-то не работал без -Wl,--no-as-needed при линковке с потоками из std.. не подключал pthread? под чем собираешь? с какими опциями? иногда у конкретных версий-систем бывают разные особенности. ну и сторонние библиотеки можно по-разному собирать. |
|
alexy | Дата 24.10.2013, 12:12 |
о, работает как надо спасибо объект в shared_ptr уничтожается когда завершаются потоки его использующие. да, класс который я использую разумеется сам потокобезопасный.. там мутексы boost::signals2 и. т.д. зы: почему-то не работал без -Wl,--no-as-needed при линковке с потоками из std.. не подключал pthread? |
|
Iron Bug | Дата 24.10.2013, 0:31 |
в твоем коде указатель используется прямо на месте, то есть любой умный указатель в принцепе подойтед. функция go завершит исполнение и объект уничтожится.. никто тебе не запрещает передавать объект в go() извне, а внутри передавать его дальше. я просто привела простой пример. go() там, кстати, только для демонстрации использования this в лямбда-функциях (у тебя он зачем-то прилеплен в вызовах). если в этот пример подставить shared_ptr, то он будет потокобезопасный и у него может быть сколько угодно копий. я просто думала, что у тебя вызовы последовательно используют объект. Внимание! "потокобезопасность" shared_ptr - это лишь безопасность обращений к самому указателю: безопасный счётчик ссылок и вызов деструктора объекта. сам объект, на который он указывает, не защищён. и если в разных потоках происходит изменение этого объекта, то надо ставить мьютексы или ещё какие-то средства синхронизации для обращения к памяти. В случае простой передачи данных (функции thread_func - просто заглушки в том месте, где нужно вызвать создание потока):
Вот реализация с бустовскими потоками (проверено, это работает): Раскрывающийся текст
|
|
alexy | Дата 23.10.2013, 23:29 |
если я правильно поняла твою задачу не совсем... в твоем коде указатель используется прямо на месте, то есть любой умный указатель в принцепе подойтед. функция go завершит исполнение и объект уничтожится.. я попробовал передать копии shared_ptr внути go, думал упадет, но результат был тот же - объект также уничтожался по завершении функции go. а мне нужно чтобы эту лямюду "запостить" в поток. этот поток вызовет её уже тогда, когда функция, "запостившая" и создавшая этот объект, закончит выполнение. объект, созданный в функции оператором new должен удалиться тогда, когда завершит исполнение последняя лямбда функция (иначе крах - обратиться к удаленному объекту). сами объекты потокобезопасные.. P.S. тут такие кренделя С++11, что можно запутаться да уж.. ногу сломаешь )) да, там в стандарте ничего не описанно. на сколько я понял, move нужна чтобы передать управление указателем в эту лямбду.. то есть лямбда завершается и объект уничтожается. но мне не подходит - у меня несколько лямбд, кто будет последней не знаю т.к. они в разных потоках. а std::bind я так понимаю уничтожает привязанные боъекты тогда, когад уничтожается объект, возращаенной это функцией, так? |
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 28.4.2024, 22:42 |