Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многопоточность, вызов функции, её аргументы 
:(
    Опции темы
EnergoHokum
Дата 8.11.2007, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Кратко о задаче: Есть цикл с фиксированным количеством проходов, в этом цикле некоторая переменная принимает значение, для каждого прохода другое. После этого создаётся поток (::CreateThread(LPVOID lpVoid)), куда я переда. указатель на эту переменную (в потоке она обрабатывается и т. д.). Поток продолжает работать и после окончания цикла, т. е. их будет несколько. Сразу же после создания потока и передачи ему указателя цикл уходит на новую итерацию.
Проблема в том, не случится ли такого, что поток, получивший указатель на переменную N-ной итерации, обращаться будет уже к N+1 (2, 3..)-ей переменной?
PM MAIL ICQ   Вверх
JackYF
Дата 8.11.2007, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(EnergoHokum @  8.11.2007,  15:51 Найти цитируемый пост)
Проблема в том, не случится ли такого, что поток, получивший указатель на переменную N-ной итерации, обращаться будет уже к N+1 (2, 3..)-ей переменной? 

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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
EnergoHokum
Дата 8.11.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Не, там много чего передавать нужно... Придумалось так: пакую то, что нужно передавать и какой-нить handle в структуру, отдаю указатель на неё потоку а в основной программе жду, когда поток установит handle в сигнальное состояние. Костыляндия, конечно, но пока ничего более другого smile в голову не приходит...
PM MAIL ICQ   Вверх
Alek86
Дата 8.11.2007, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



в винапи именно для этого используются события.

и вообще рекомендую прочесть про примитивы синхронизации
Event, Semaphore, Timer...

и функции
WaitForSingleObject и WaitForMultiplyObjects

если ты не начинающий и тебе нужна кросс- программа, то в бусте есть библиотека Threads, кажись


--------------------
user posted image    user posted image
PM MAIL   Вверх
vladimir_ad
Дата 8.11.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 7.9.2007

Репутация: нет
Всего: нет



Цитата(EnergoHokum @  8.11.2007,  15:51 Найти цитируемый пост)
в этом цикле некоторая переменная принимает значение, для каждого прохода другое. После этого создаётся поток (::CreateThread(LPVOID lpVoid)), куда я переда. указатель на эту переменную 

Ты передаешь указатель на переменную всем потокам один итотже smile 
Если потоки должны работать с собственными данными делай для каждого потока свой буфер и передавай на него указатель.


PM MAIL   Вверх
Alek86
Дата 8.11.2007, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



а если данные огромные?
все он правильно делает, просто надо работу потоков синхронизировать и все


--------------------
user posted image    user posted image
PM MAIL   Вверх
vladimir_ad
Дата 8.11.2007, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 7.9.2007

Репутация: нет
Всего: нет



Цитата(Alek86 @  8.11.2007,  16:19 Найти цитируемый пост)
и вообще рекомендую прочесть про примитивы синхронизации

Вероятно EnergoHokum это и имел ввиду под выражением 
Цитата(EnergoHokum @  8.11.2007,  16:03 Найти цитируемый пост)
и какой-нить handle 

Однако непонятно его недовольство.
PM MAIL   Вверх
EnergoHokum
Дата 8.11.2007, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Ну да, через события это и сделал. Вроде должно работать, как задумано smile Компиляция и запуск расставят всё по местам...
PM MAIL ICQ   Вверх
vladimir_ad
Дата 8.11.2007, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 7.9.2007

Репутация: нет
Всего: нет



Цитата(Alek86 @  8.11.2007,  16:27 Найти цитируемый пост)
а если данные огромные?
все он правильно делает,

А что он привильно делает? Передает указатель на одну переменную в несколко потоков?

Он сам сказал "в этом цикле некоторая переменная принимает значение, для каждого прохода другое. "

Это сообщение отредактировал(а) vladimir_ad - 8.11.2007, 16:33
PM MAIL   Вверх
EnergoHokum
Дата 8.11.2007, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Я после передачи handle, инициализированного Event-ом потоку, жду, когда он его освободит. Освободит он его только после того, как перепишет себе все переменные, которые в создающем потоке на следующей итерации изменятся. Немного путано получилось...
PM MAIL ICQ   Вверх
vladimir_ad
Дата 8.11.2007, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 7.9.2007

Репутация: нет
Всего: нет



Ага. Я так понял:
В цикле ты получаешь данные размещенные в буфере;
Далее создаешь поток и передаешь ему указатель на буфер;
Полученный поток (умный) создает копию буфера, сообщает о завершении копирования через Event;

если да то:
в цикле выделяем память под буфер, копируем;
создаем поток и передаем ему указатель на новый буфер;
в потоке по мере необходимости управляем буфером и удаляем его.

ждать ничего не нужно.


PM MAIL   Вверх
EnergoHokum
Дата 8.11.2007, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Хм, тоже вариант, пожалуй, и лучше событий будет... Попробую.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0750 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.