![]() |
Модераторы: xvr |
![]() ![]() ![]() |
|
Soeth |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 30.6.2011 Репутация: нет Всего: нет |
Добрый вечер, столкнулся с непонятной проблемой, хотелось бы попросить помощи у знающих людей. )
Есть класс:
Есть 2 потока, каждый создает свой объект типа someClass, а проблема заключается в том, что при вызове метода function1 что первый, что второй поток выдают один и тот же адрес переменной. Собственно в этом и проблема, 2 потока работают с одной переменной и одновременно меняют в ней данные. Проблему можно решить синхронизацией потоков, к примеру мьютексами, но хотелось бы узнать у гуру, есть ли какая либо возможность 2 потокам одновременно работать с 2 объектами класса не блокируя первый пока работает второй ибо это не вариант если будет не 2, а 10 потоков работающих с этим объектом. Спасибо за внимание. |
|||
|
||||
Cheloveck |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
![]() Это сообщение отредактировал(а) Cheloveck - 6.11.2013, 00:35 -------------------- ![]() |
||||
|
|||||
Soeth |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 30.6.2011 Репутация: нет Всего: нет |
Немного не правильно сформулировал проблему. Если запускать 2 потока или один, которые используют объект класса someClass, и не дожидаясь завершения потоков (без pthread_join()) снова создавать потоки использующие данный класс, то тогда адрес var первого работающего потока будет такойже как адрес var второго потока. Пример:
Что выдает: 0xb6c7837c 0xb747937c Pack: 0 0xb747937c 0xb6c7837c Pack: 1 0xb747937c 0xb6c7837c Pack: 2 Пока первая пачка потоков успевает отработать до запуска второй пачки потоков всё в порядке, но если к потоки будут работать к примеру по 5-10 секунд, а интервал между вызовами foo() будет 1-2 секунды, то получится, что все потоки будут работать с одним и тем же участком памяти. Хотелось бы решить данную задачу без применения мьютексов и блокировки var на время работы одной пачки потоков т.к. в реальной задаче необходимо запускать эти "пачки" потоков в сравнительно небольшом интервале времени относительно времени выполнения потоковой ф-ии. Т.е. очередь потоков, ожидающих доступа к var будет только расти. |
||||||||
|
|||||||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 1 Всего: 45 |
Простите, но новые потоки просто занимают то же адресное пространство, что и завершившиеся старые, соответственно, адреса и совпадают. Это отнюдь не значит, что старые (от предыдущей пачки) потоки всё ещё работают, а новые (от новой пачки) внезапно начали работать с перекрывающимися областями памяти. Не нужна Вам здесь синхронизация.
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С/С++: Программирование под Unix/Linux" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |