Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
50 / 31 / 4
Регистрация: 25.04.2013
Сообщений: 366

Передача копии адреса в поток

08.09.2015, 17:13. Показов 1807. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Проблема в том что когда запускается поток итератор уже указывает за пределы листа. Как передать копию адреса или владение адресом, как решить проблему?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int main()
{
    list<string> a;
    a.push_back("1");
    a.push_back("2");
    a.push_back("3");
    a.push_back("4");
 
    list<string>::iterator it;
    it = a.begin();
    while (it != a.end())
    {
        CreateThread(0, 0, (LPTHREAD_START_ROUTINE)test, (LPVOID *)&it, 0, 0);
        it++;
    }
 
 
 
    system("pause");
}
 
DWORD WINAPI test(LPVOID * a)
{
 
    list<string>::iterator *it = (list<string>::iterator*)a;
    cout << (*it)->c_str()<<endl;
    return 0;
 
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.09.2015, 17:13
Ответы с готовыми решениями:

Передача адреса на стековую переменную в другой поток -- сработает ли?
Приветствую. Прочитал, что у каждого потока свой стек. Непонятно. Ситуация: в одном потоке есть функция void foo(int* v) { ...

Передача в функцию копии матрицы
1) Я создаю массив указателей(матрицу) на char. char** mapInChar. 2) Выделяю память в зависимости от размеров нужных мне. ...

Чтение бинарного файла в поток std::ifstream и вывод в другой бинарный файл std::ofstream (создание копии)
Проверил работу программы на маленькой картинке(744 байт). Все работает. С несколько бОльшими файлами(512КБ) нет. Суть задачи в том,...

8
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
08.09.2015, 18:00
Как-то так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void test(list<string>::iterator a)
{
    cout<<*a<<endl;
}
int main()
{
    list<string> a;
    a.push_back("1");
    a.push_back("2");
    a.push_back("3");
    a.push_back("4");
 
    vector<thread>threads;
    for(auto pos=a.begin();pos!=a.end();++pos)
        threads.emplace_back(test,pos);
    for(auto&pos:threads)
        pos.join();
}
0
50 / 31 / 4
Регистрация: 25.04.2013
Сообщений: 366
08.09.2015, 18:05  [ТС]
Нужно именно винапи
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
08.09.2015, 18:11
Тады создавать отдельный список итераторов (list<list<string>::iterator>) и скармливать его элементы этому винапи. Или вместо итераторов передавать обычные указатели на строки.
1
50 / 31 / 4
Регистрация: 25.04.2013
Сообщений: 366
08.09.2015, 18:25  [ТС]
Код который тут я написал - это тест, в реальности там лист с структурой в которой сокеты и адреса... Задумка была такая что в потоках чекается 1 сокет и если он не отвечает, то передается внутри потока методу erase. Передать структуру не проблема, но как потом ее удалить из листа, обходить весь лист или копить их в другом листе и потом копировать в основной?

Добавлено через 5 минут
С листом итераторов будет тоже самое что и сейчас - пока будет запускаться поток, главный цикл обойдет весь лист и какой нибудь поток будет иметь итератор указывающий за границы контейнера.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
08.09.2015, 18:36
Цитата Сообщение от MousePro Посмотреть сообщение
С листом итераторов будет тоже самое что и сейчас - пока будет запускаться поток, главный цикл обойдет весь лист и какой нибудь поток будет иметь итератор указывающий за границы контейнера.
С чего бы? Листу итераторов пофиг что там у вас в итераторе цикла.
C++
1
2
3
4
5
for(auto pos=a.begin();pos!=a.end();++pos)
{
    iterator_list.push_back(pos);
    CreateThread(0, 0, (LPTHREAD_START_ROUTINE)test, (LPVOID *)&iterator_list.back(), 0, 0);
}
1
50 / 31 / 4
Регистрация: 25.04.2013
Сообщений: 366
08.09.2015, 18:41  [ТС]
Это тоже самое что собрать все структуры в 1 листе и заменить им основной
Мне же все равно в начале придется обойти основной для создания листа итераторов.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
08.09.2015, 19:07
Лучший ответ Сообщение было отмечено MousePro как решение

Решение

Ну, в порядке выпендрежа:
C++
1
2
3
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)test, *(void**)&it, 0, 0);
...
list<string>::iterator it =*(list<string>::iterator*)&a;
Но прибито гвоздями к предположению о том, что итератор это указатель с тривиальным конструктором копирования.
1
50 / 31 / 4
Регистрация: 25.04.2013
Сообщений: 366
08.09.2015, 20:01  [ТС]
Пойдет, конструктор копирования там самый тривиальный (стандартный)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.09.2015, 20:01
Помогаю со студенческими работами здесь

Передача переменных в поток
Вот никак не могу разобраться, как передать переменную в функцию потока. Вот например есть код: DWORD WINAPI Ms(LPVOID pr) { ...

Передача аргумента в созданный поток
Здравствуйте, суть такова: Создаётся некий поток: DWORD WINAPI MyThread(LPVOID lpParam) { MyStruct data = *(MyStruct*)...

C++ 11 передача ссылки в поток thread
Доброго времени суток, возникла такая ситуация. Использую я QT Creator с компилятором MinGW32 Есть у меня статический метод который я...

Передача адреса класса в функцию
Здравствуйте:) У меня такой вопрос, нигде не могу найти ответ: как сделать так, чтобы функция принимала адрес класса, или какой-то...

Передача в процедуру адреса функции
1.Не могу найти где прочитать - как вызывать функцию, если передается ее адрес - и как выглядит вызов и обращение к ней? 2. Нужен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru