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

Атомарная операция

17.02.2016, 17:24. Показов 1373. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня есть такой класс:
C++
1
2
3
4
5
6
7
8
class CClass
{
public:
    bool state() const {return state_;}
private:
    bool state_ = false;
    std::mutex  mutex_;
};
Как сделать state() атомарной?
Пробовал сделать state() так:
C++
1
2
3
4
5
6
7
8
bool CClass::state() 
{
    bool a;
    mutex_.lock();
    a= state_;
    mutex_.unlock();
    return a;
}
Программа все-равно падает...
Вообще, state_ имеет другой тип состоящий из структуры, здесь написал bool для краткости.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.02.2016, 17:24
Ответы с готовыми решениями:

операция <<::>>
имею код char Car::*Get_Marka(){ return marka ; } char Car::*Get_Color() { return color ; }...

Атомарная операция
Всем добрый день. Я только начал изучать язык и прошу помочь разобраться. Как в методе transfer...

Атомарная группировка в PHP
Читаю сейчас всеми известную книгу - Дж.Фридл - &quot;Регулярные выражения&quot;. Дошел до момента с...

Операция (1С 7.7)
Как при проведении документа записать его в операцию со значением реквизита &quot;Документ&quot; (В операции)...

9
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
17.02.2016, 17:44 2
C++
1
std::atomic<Type> state_ ;
А вообще, смотря как всё это дело использовать.
0
-L
15 / 9 / 12
Регистрация: 03.12.2015
Сообщений: 79
17.02.2016, 20:52 3
Ээм... А чем вариант с мьютексом плох? Не вижу причины для падения.

Кстати, если делать std::atomic структуры, то Вы сможете только потокобезопасно читать и писать в неё целиком. У вас не будет атомарного доступа к отдельным элементам. Только выгрузка load() и использование как обычно. Если же делать атомарными элементы структуры, то действует обратное правило - отдельные эелементы будут атомарны, а вся структура нет. Насколько мне известно atomic по сути использует тот же мьютекс
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
17.02.2016, 21:31 4
-L, думаю, падения связаны с тем,
что сам интерфейс класса заточен под однопоточное
использование. Тут нужно либо менять его,
либо лочить уже во внешнем коде.
0
7 / 7 / 3
Регистрация: 19.03.2010
Сообщений: 182
18.02.2016, 09:37  [ТС] 5
Цитата Сообщение от -L Посмотреть сообщение
Ээм... А чем вариант с мьютексом плох? Не вижу причины для падения.
У меня много различных классов, объекты которых зачастую работают в многих потоках (вообще программа должна работать на сервере, так что объектов много и потоков тоже). И мьютексы, предполагаю, должны быть глобальными и их должно быть много. мьютексы принадлежащие какому-то классу, где они нужны - также разрушаются при попытке доступа к ним с другого потока параллельно.

Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
std::atomic<Type> state_ ;
А возможно это сделать для пользовательского (произвольного) типа?
И использование этого свойства после такого объявления будет как обычно в коде? Т.е. state_ == true?

Цитата Сообщение от Croessmah Посмотреть сообщение
либо лочить уже во внешнем коде.
Внешний код?
0
-L
15 / 9 / 12
Регистрация: 03.12.2015
Сообщений: 79
18.02.2016, 10:21 6
Цитата Сообщение от feck Посмотреть сообщение
мьютексы принадлежащие какому-то классу, где они нужны - также разрушаются при попытке доступа к ним с другого потока параллельно.
Мьютексы как раз для этих целей и нужны вроде как.

Что значит разрушаются? Если Вы удаляете мьютекс, пока он кем-то залочен, то это может привести к чему угодно.

Также если Вы внутри одного потока попробуете повторно залочить уже залоченный ранее std::mutex, то вылетит ошибка. Для решения таких проблем существует std::recursive_mutex (количество попыток залочить который внутри одного потока тоже не безгранично, кстати)
0
7 / 7 / 3
Регистрация: 19.03.2010
Сообщений: 182
18.02.2016, 10:57  [ТС] 7
В общем, сделал атомарной и все-равно программа падает при попытке чтения этого значения...
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,279
18.02.2016, 11:39 8
Цитата Сообщение от feck Посмотреть сообщение
все-равно программа падает при попытке чтения этого значения
Так это может быть дело и не в многопоточности.
0
7 / 7 / 3
Регистрация: 19.03.2010
Сообщений: 182
18.02.2016, 12:48  [ТС] 9
DrOffset, да, может быть. Сейчас открыл журнал windows и обнаружил, что Access violation reading location 0x00000020. Походу, указатель на объект "промахивается".

Добавлено через 1 час 3 минуты
Да, атомные операции оказались вообще не нужны. Ошибка была совсем из-за другого.
P.S. теперь всегда буду проверять указатели на nullptr перед использованием)
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,279
18.02.2016, 12:51 10
Цитата Сообщение от feck Посмотреть сообщение
P.S. теперь всегда буду проверять указатели на nullptr перед использованием)
Лучше с отладчиком разобраться. Такие ошибки с ним находятся на счет раз
0
18.02.2016, 12:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.02.2016, 12:51
Помогаю со студенческими работами здесь

Операция *new
Добрый вечер. Просматривая исходники QCalendarWidget, обнаружил странную форму записи new, вот так:...

Операция $this->
Здравствуйте. Учу ООП. И не понимаю написанное в книге: &quot;Операция $this-&gt; принадлежит отдельному...

Операция присваивания (=)
Добрый день, интересует вот что: правильно ли я считаю, что в int x = .0 + 1F + 4L; 1) Сперва...

Битовая операция
Выполнить проверку заданного (вводится с клавиатуры) бита числа В и если заданный бит имеет...


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

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

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