crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> std::shared_ptr и лямбда функции
alexy
  опции профиля:
сообщение 24.10.2013, 22:16
Сообщение #11


Студент
*

Группа: Участник
Сообщений: 44
Регистрация: 4.8.2010
Пользователь №: 1931

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Iron Bug @ 24.10.2013, 19:23) *
под чем собираешь? с какими опциями? иногда у конкретных версий-систем бывают разные особенности. ну и сторонние библиотеки можно по-разному собирать.

g++ . А какие сторонние библиотеки? это было только std..
Раскрывающийся текст
$uname -a
Linux winter 3.2.0-54-generic #82-Ubuntu SMP Tue Sep 10 20:09:12 UTC 2013 i686 athlon i386 GNU/Linux
$g++ --version
g++ (Ubuntu/Linaro 4.7.3-2ubuntu1~12.04) 4.7.3
Copyright (C) 2012 Free Software Foundation, Inc.
Это свободно распространяемое программное обеспечение. Условия копирования
приведены в исходных текстах. Без гарантии каких-либо качеств, включая
коммерческую ценность и применимость для каких-либо целей.


если например (это твой код из последнего поста, с потоками из std) сказать
g++ --std=c++11 -Wl,--no-as-needed -lpthread iron_code.cpp
то собиреться, а если
g++ --std=c++11 -lpthread -Wl,--no-as-needed  iron_code.cpp
то не собереться... ерунда какая-то. вот выхлоп
./a.out
terminate called after throwing an instance of 'std::system_error'
  what():  Enable multithreading to use std::thread: Operation not permitted
[1]    14982 abort (core dumped)  ./a.out




Цитата(Iron Bug @ 24.10.2013, 21:53) *
bind ничего не делает сам. существование объектов должен обеспечить программист. на этот раз не стала писать по старой привычке, через boost :), сделала всё через std. хотя я не сравнивала скорость реализаций. это ещё открытый вопрос.

ну да.. сам ничего не далет)) я про деструктор говорил. этот код ответил на вопрос :)
да, скорость не знаю.. но мне кажется std как бы родной :). хотя например upgradable мутекса там нету, а нужен..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 25.10.2013, 17:27
Сообщение #12


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


именно bind ничего особенного не делает. это свойство shared_ptr - увеличивать счётчик при передаче в любую функцию. поэтому bind тут просто выступает в роли функтора, в котором есть shared_ptr. когда функтор отрабатывает и уничтожается - освобождается и shared_ptr. если бы там был обычный указатель - он бы рухнул при вызове в потоке.
а насчёт boost: я его использую, кажется, с 31-й версии (если я правильно помню). так что для меня это уже почти что десять лет практики и я привыкла его использовать везде. так как boost - не просто библиотека, а испытательный полигон стандартизации С++, то почти все разработки boost потом переходят в стандарт.

насчёт сборки с потоками:
вообще, GCC принимает опцию -pthread (не -lpthread!), которая определена как -D_REENTRANT -lpthread. либо добавь её, либо определение реентерабельных функций.

в старых компиляторах библиотеки и сорцы иногда ещё нужно было указывать в обязательно строгом порядке. попробуй указать линковку после сорца. как-то так:
g++ --std=c++11 iron_code.cpp -pthread

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

Сообщение отредактировал Iron Bug - 25.10.2013, 18:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 25.10.2013, 20:26
Сообщение #13


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


и ещё, кстати, про потоки и функции: может, тебе стоит посмотреть на библиотечку <future>, в частности на std::async? штука полезная. по-моему, как раз очень близко к тому, что ты пытается реализовать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 17.6.2014, 23:39
Сообщение #14


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


А у меня вопрос по этому кусочку:
pthrd1 = new thread(thread_func,3000,pfoo,[&pfoo](const std::shared_ptr<foo> pfoo)->string { return string("Func1: ") + pfoo->say_hello(); })

Зачем здесь захватывается pfoo? Оно же и так скопируется при вызове лямбды?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 18.6.2014, 7:55
Сообщение #15


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


да, он там не нужен. видимо, просто остался от правки какого-то другого кода.

Сообщение отредактировал Iron Bug - 18.6.2014, 7:56
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V  < 1 2
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 0:22