7 / 7 / 1
Регистрация: 27.05.2011
Сообщений: 297
1

Синхронизация ресурса между потоками

19.07.2014, 19:34. Показов 1369. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!) Возник вопрос.. незнаю как его решить..

Предположим есть класс A, с числовой переменной a + геттер\сеттер на нее.

В двух потоках я вызываю класс А обращаюсь к сеттеру и передаю ему параметр, который состоит из значения которое возвращает геттер плюс некоторое рандомное число.. вот так. set_a(A.get_a+RANDOM_KEY);

При этом что я получаю...
Предположим, что переменная а класса А равна 10. Оба потока вызывают геттеры и запоминают значение 10. Один из потоков засыпает. А второй вызывает сеттер(и передает значение которое получит от геттера + какое то число, допустим, 5). В итоге значение переменной а класса А равно 15.

Далее просыпается тот поток, который уснул. Он помнит о той 10ке, которую получил из геттера и плюсует к ней, допустим 2. По итогу значение переменной а класса А меняется с 15 на 12.

А хотелось бы чтобы первый поток выполнил сначала гет и сразу сет, а потом уже второй гет и сет. В таком случае значение переменной было бы: 10+5 = 15 <--поток 1 15+2=17<--- поток 2, а не 10 + 5 = 15 --поток1 10+2=12--поток 2.

Мои предположения... Установить на геттер и сеттер класса А параметр синхронайзед. Но в таком случае я заблокирую весь класс и если есть еще потоки которые юзают другие методы этого класса то они встанут в очередь, что не есть хорошо.. Поэтому я создаю какой-то левый объект и в геттере и сеттере делаю блок синхронайзед с завязкой на левый объект.. ЧТо это дает? Наверно ничего, а почему? Потому что первый поток входит в гет и выходит получая 10 и засыпает после этого. Второй поток входит в гет получает 10 и бросает ее на сет..
Вобщем.. В последнем предложении я слегка напутал хронологию, но суть думаю понятна. Нету реальной синхронизации. Как ее обеспечить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.07.2014, 19:34
Ответы с готовыми решениями:

Взаимодействие между потоками и зсувками
Написать параллельную программу с общей переменной типа integer и двумя рабочими процессами....

Как происходит переключение между потоками исполнения
Разбирал тестовый пример с семафорами в Java. Работа семафоров понятна. Решил попробовать запустить...

Синхронизация между потоками
Вот, например у меня есть основной Ui поток и поток Thread который он породил. И Tread меняет какую...

Синхронизация итераций между потоками
Добрый день. Сразу скажу, что облазил все доступные мне офф. доки по Qt и полгугла, но не нашел...

3
61 / 61 / 19
Регистрация: 06.09.2013
Сообщений: 236
Записей в блоге: 1
19.07.2014, 20:38 2
Либо у вас статические методы, либо у вас некорректная терминология.

А как вы по другому хотите решить вопрос? Если у вас 2 потока, то при современном железе вряд ли вы испытаете проблему очереди. Поток вошел в монитор - другие потоки не смогут использовать синхронизированные методы ассоциированные с данным монитором. Поток закончил работу - вышел, монитор свободен.

Если потоки должны поочередно выполнять операции - используйте межпотоковые коммуникации.
0
Эксперт Java
4091 / 3825 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
20.07.2014, 02:35 3
waip, Проще всего создать метод, который будет иметь модификатор synchonized и который будет делать то что вам нужно: вызывать set_a(A.get_a+RANDOM_KEY);
0
61 / 61 / 19
Регистрация: 06.09.2013
Сообщений: 236
Записей в блоге: 1
20.07.2014, 03:29 4
Ну или использовать параллельные утилиты из пакета java.util.concurrent.
0
20.07.2014, 03:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.07.2014, 03:29
Помогаю со студенческими работами здесь

Lock-free синхронизация: как организуется нотификация между потоками?
Добрый день! Хотелось бы услышать о реальном опыте, потому что теоретических советов в гугле...

Сигналы между потоками
Подскажите, что не так с моими изысканиями в использовании потоков в Qt Проблема в том, что не...

Интервал между потоками
Здравствуйте. Имеется несколько потоков. Необходимо при выполнении необходимой операции одним...

Уведомления между потоками
Здравствуйте! Набросал код для экспериментов: #include &quot;stdafx.h&quot; int блок_1(HWND *hWnd,...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru