|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
05.11.2013, 19:37 | #1 |
Регистрация: 30.06.2011
Сообщений: 7
|
Не понятная проблема, адрес переменной класса у 2 объектов класса одинаков
Добрый вечер, столкнулся с непонятной проблемой, хотелось бы попросить помощи у знающих людей. )
Есть класс: Код:
Проблему можно решить синхронизацией потоков, к примеру мьютексами, но хотелось бы узнать у гуру, есть ли какая либо возможность 2 потокам одновременно работать с 2 объектами класса не блокируя первый пока работает второй ибо это не вариант если будет не 2, а 10 потоков работающих с этим объектом. Спасибо за внимание. Последний раз редактировалось Stilet; 05.11.2013 в 21:49. |
05.11.2013, 19:41 | #2 |
Старожил
Регистрация: 19.08.2009
Сообщений: 2,119
|
Soeth
каждый создает свой объект типа someClass проблема заключается в том, что при вызове метода function1 что первый, что второй поток выдают один и тот же адрес переменной не верю. либо у тебя какой-то палёный и некачественный c++ сомнительного происхождения, скорее всего подделка из китая.
А вы почему со мной не соглашаетесь, у вас что, импотенция? (c) ACE Valery
|
05.11.2013, 20:05 | #3 | |
Регистрация: 30.06.2011
Сообщений: 7
|
Цитата:
Код:
0xb6c7837c 0xb747937c Pack: 0 0xb747937c 0xb6c7837c Pack: 1 0xb747937c 0xb6c7837c Pack: 2 Компилятор g++, компилю: g++ threadTest.cpp -pthread -o threadTest Как видно - адреса действительно повторяются.. Последний раз редактировалось Stilet; 05.11.2013 в 21:50. |
|
05.11.2013, 21:41 | #4 | |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
странный пример, много лишнего, ИМХО.
зачем тут эти мьютексы, массивы статусов, счетчики запущенных потоков и прочее? Если вдруг какой-то поток не удалось создать - ты навечно застрянешь в этом цикле: Код:
Цитата:
Последний раз редактировалось rrrFer; 05.11.2013 в 21:51. |
|
05.11.2013, 23:29 | #5 |
Старожил
Регистрация: 19.08.2009
Сообщений: 2,119
|
0xb6c7837c
0xb747937c раз, два, три, дальше много... :lol:
А вы почему со мной не соглашаетесь, у вас что, импотенция? (c) ACE Valery
|
06.11.2013, 01:42 | #6 | |
Регистрация: 30.06.2011
Сообщений: 7
|
Цитата:
Счетчики запущеных потоков для того, что по постановке задачи я должен запустить функцию, которая запустит несколько потоков и не дожидаясь их завершения отработает и завершится и будет вызвана снова для запуска уже новой пачки потоков, только уже с другими параметрами. Если не дождаться запуска всех потоков и сделать выход из ф-ии, которая запускает потоки, то не факт, что все потоки успеют запустится и будут удалены локальные переменные, которые передаются потоковой ф-ии в качестве параметра. В примере простоты ради этого нет. А проблема собственно в том, что адрес var в этих 3 пачках одинаков и если первая пачка потоков еще будет работать с объектом класса someClass в тот момент, когда будет запущена вторая пачка потоков, то произойдет обращение 2 потоков к одному участку памяти. 0xb6c7837c 0xb747937c Pack: 0 0xb747937c 0xb6c7837c Pack: 1 0xb747937c 0xb6c7837c Pack: 2 В данном примере потоки отрабатывают быстро, и успевают завершится за 250 миллисекунд (usleep(250 * 1000), но в случае, если someClass производит, к примеру, скачивание и потом обработку данных, которая занимает секунд 5-10, а интервал между запусками пачек потоков 1-2 секунды будет акая проблема. |
|
06.11.2013, 04:44 | #7 | |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Цитата:
|
|
06.11.2013, 04:48 | #8 | |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Цитата:
Потоки завершаются, создаются новые, такие же. Почему адреса должны быть другими? Впихни внутрь свой тестовой функции вечный цикл, чтобы поток не завершился и смотри на разные адреса. Не придумывай проблем, их и так хватает ) Не поленился, впихнул, проверил, работает: Последний раз редактировалось rrrFer; 06.11.2013 в 04:50. |
|
06.11.2013, 05:10 | #9 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Проблема с массивом экземпляров класса переменной длины | Xuch | Общие вопросы C/C++ | 5 | 26.03.2013 13:00 |
Для public переменной класса присвоить адрес ячеек из внешней переменной | _KUL | Qt и кроссплатформенное программирование С/С++ | 2 | 28.05.2012 12:04 |
Конструктор класса не хочет принимать в качестве параметра адрес объекта другого класса | Jugger | Помощь студентам | 3 | 05.01.2012 04:10 |
Определение типа класса по переменной на объект этого класса при компиляции | phomm | Общие вопросы Delphi | 24 | 08.04.2011 14:11 |
Адрес метода класса? | VintProg | Общие вопросы Delphi | 6 | 27.09.2009 13:10 |