Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Программирование под Unix/Linux > Адрес члена класса у 2 объектов класса |
Автор: Soeth 5.11.2013, 18:47 | ||
Добрый вечер, столкнулся с непонятной проблемой, хотелось бы попросить помощи у знающих людей. ) Есть класс:
Есть 2 потока, каждый создает свой объект типа someClass, а проблема заключается в том, что при вызове метода function1 что первый, что второй поток выдают один и тот же адрес переменной. Собственно в этом и проблема, 2 потока работают с одной переменной и одновременно меняют в ней данные. Проблему можно решить синхронизацией потоков, к примеру мьютексами, но хотелось бы узнать у гуру, есть ли какая либо возможность 2 потокам одновременно работать с 2 объектами класса не блокируя первый пока работает второй ибо это не вариант если будет не 2, а 10 потоков работающих с этим объектом. Спасибо за внимание. |
Автор: Cheloveck 6.11.2013, 00:34 | ||||
![]() |
Автор: Soeth 6.11.2013, 02:00 | ||||||||
Немного не правильно сформулировал проблему. Если запускать 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 6.11.2013, 20:30 | ||||
Простите, но новые потоки просто занимают то же адресное пространство, что и завершившиеся старые, соответственно, адреса и совпадают. Это отнюдь не значит, что старые (от предыдущей пачки) потоки всё ещё работают, а новые (от новой пачки) внезапно начали работать с перекрывающимися областями памяти. Не нужна Вам здесь синхронизация.
|