![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| correy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 1.6.2010 Репутация: нет Всего: нет |
Здравствуйте, уже второй день бьюсь над темой. Может быть кто поможет.
У меня есть функция: ComputeSum(vector <wstring> files, int begin, int end), которая проходит вектор от begin до end, подсчитывая определенную сумму. Мне нужно, чтобы каждый из двух потоков пробегал свою часть вектора и возвращал свою сумму, каждую из которых я потом сложу и получу профит! Кто-нибудь поможет? |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| correy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 1.6.2010 Репутация: нет Всего: нет |
Именно с этим и требуется помощь
|
|||
|
||||
| correy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 1.6.2010 Репутация: нет Всего: нет |
Немного разобрался, получается следующее:
boost::future <int> s1,s2; s1 = boost::async(boost::bind(&::ComputeSum,files, begin1, end1)); int sum1 = s1.get(); s2 = boost::async(boost::bind(&::ComputeSum,files, begin2, end2)); int sum2 = s2.get(); Но в данном случае потоки работают последовательно. Или я ошибаюсь? И если я не прав, то как реализовать параллельное выполнение? |
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
пример на C++11, но в boost он не должен сильно отличаться.
Добавлено через 1 минуту и 23 секунды
Нет, все верно. Надо сперва создавать потоки а потом вызывать get(), так-как он блокирует вызов до завершения потока. |
||||
|
|||||
| correy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 1.6.2010 Репутация: нет Всего: нет |
Спасибо большое за пример!
Т.е. так потоки уже будут работать параллельно?
|
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| correy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 1.6.2010 Репутация: нет Всего: нет |
Спасибо большое. И еще последний вопрос остался: мне в задании необходимо после каждой итерации суммирования усыплять поток на 1 секунду. Когда я запускаю свою программу, то иногда она просто зависает и не выводит результат. Это как-то может быть связано с усыплением потоков? Грубо говоря, сейчас все работает через раз |
|||
|
||||
| correy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 1.6.2010 Репутация: нет Всего: нет |
Возможно проблема с зависанием возникает, когда оба потока хотят одновременно вывести на экран? Если да, то как корректно организовать работу с мьютексами? Я попробовал так, но получилось не очень
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
correy, никогда не сталкивался с проблемой конкурентного вывода на консоль. Максимум, данные идут в разнобой, но ничего не виснет.
Повисания могут происходить из-за ситуации, когда один и тот же мьютекс лочится два раза. Если такой ситуации нет, то возможна более сложная: поток1 лочит мьютекс m1, поток2 лочит мьютекс m2, поток1 пытается залочить m2 и встает в ожидании, поток2 пытается залочить m1 и тоже встает. Выйти из этой ситуации уже нельзя. Надо исправлять код. |
|||
|
||||
| correy |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 1.6.2010 Репутация: нет Всего: нет |
Т.е. можно вообще обойтись без использования мьютексов? Т.к. мне кажется, что у меня нет больше ресурсов, за которые эти потоки могут бороться. Тогда непонятна причина зависания :( Добавлено через 2 минуты и 4 секунды Вот тут код моей функции:
Не могу понять, в чем может быть проблема( |
||||
|
|||||
| correy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 1.6.2010 Репутация: нет Всего: нет |
Кажется разобрался, всем спасибо!
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
correy, пожалуйста, всегда пиши как решил проблему. Потому что у кого-то она тоже может возникнуть.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |