Форум программистов, компьютерный форум, киберфорум С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 215
1

Как перегрузить ++ для std::atomic<class>?

07.09.2024, 20:53. Показов 1105. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Я экспериментирую с std::atomic, наваял вот такой код
C++Выделить код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class xMe {
    public:
        int automatic = 0;
        explicit xMe() {}
        void add(int i) { this->automatic += i; }
 
};
 
std::atomic<xMe> dis;
void operator++(std::atomic<xMe> &income)
{
    income.load().add(1);
    std::cout << "v - " << &income << " " << dis.load().automatic << std::endl;
}
 
int main()
{
    auto threadedF = []()
    {
        for (size_t s = 0;s<1000;++s)
        {
            ++dis;
        }
    };
 
    std::thread thread01(threadedF);
    thread01.join();
 
    return 0;
}
Он даже компилируется, но строчка std::cout << "v - " << &income << " " << dis.load().automatic << std::endl; все значения xMe::automatic выдаёт равным нулю.

Непонятно почему , вроде цикл должен чего-то в ней менять.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.09.2024, 20:53
Ответы с готовыми решениями:

Разъясните код пжлст(выдает ошибку:cannot convert from 'class std::list<class c_bullet *,class std::allocator<class c_bullet *> >::iterator' to 'int')
Есть такие строки: std::list&lt;c_bullet*&gt; Bullets; ... for(auto i = Bullets.begin(); i !=...

Std::atomic vs std::mutex
class AtomicSome { private: std::atomic_bool _isReady; //not std::atomic_flag ...

Std::atomic выбор конструктора
недавно коллега вкомитил строчку вроде этой std::atomic&lt;int&gt; at = 3; вкоммитил с чистой душой,...

Std::atomic и другие объекты
Добрый день! Подскажите пожалуйста можно ли создать std::atomic&lt;std::vector&lt;int&gt; &gt; myvector;...

18
667 / 281 / 70
Регистрация: 07.01.2023
Сообщений: 1,155
07.09.2024, 22:23 2
Цитата Сообщение от Anton1978 Посмотреть сообщение
вроде цикл должен чего-то в ней менять.
Должен. Только load() возвращает новую копию каждый раз.
1
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 215
07.09.2024, 22:30  [ТС] 3
О как, это похоже на правду. Или это мой косяк? Просто тут https://ru.cppreference.com/w/... tomic/load сказано - Атомарно загружает и возвращает текущее значение атомарной переменной.
А как тогда можно узнать содержимое атомарного экземпляра класса ?
0
667 / 281 / 70
Регистрация: 07.01.2023
Сообщений: 1,155
07.09.2024, 22:49 4
Цитата Сообщение от Anton1978 Посмотреть сообщение
Атомарно загружает и возвращает текущее значение атомарной переменной.
совершенно верно. Только возвращает он как результат присваивания.


Цитата Сообщение от Anton1978 Посмотреть сообщение
А как тогда можно узнать содержимое атомарного экземпляра класса ?
Указатели, shared_ptr... все для вас
0
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 215
08.09.2024, 00:24  [ТС] 5
Прошу прощения, я совсем запутался. Тогда зачем существует std::atomic без специализации ?
0
фрилансер
5843 / 5372 / 1102
Регистрация: 11.10.2019
Сообщений: 14,353
08.09.2024, 08:22 6
Anton1978, засовывать под атомик не интегральные типы - так себе затея. Вот так лучше сделать:

C++Выделить код
1
2
3
4
5
6
class xMe
{
    public:
        std::atomic<int> automatic = 0;
        void add(int i) { automatic += i; }
};
0
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 215
08.09.2024, 09:51  [ТС] 7
это так, но я пытаюсь разобраться именно в том, почему в атомик можно пихать любой тип.
0
667 / 281 / 70
Регистрация: 07.01.2023
Сообщений: 1,155
08.09.2024, 10:15 8
Цитата Сообщение от Anton1978 Посмотреть сообщение
но я пытаюсь разобраться именно в том, почему в атомик можно пихать любой тип.
А почему нет-то? Просто что бы не писать работу с mutex это будет быстрее.
0
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 215
08.09.2024, 10:50  [ТС] 9
а почему да? получается же, что я с этой переменной ничего сделать не могу
0
667 / 281 / 70
Регистрация: 07.01.2023
Сообщений: 1,155
08.09.2024, 11:05 10
Цитата Сообщение от Anton1978 Посмотреть сообщение
получается же, что я с этой переменной ничего сделать не могу
Ну зависит от того как вы ее напишите.
0
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 215
08.09.2024, 13:56  [ТС] 11
например как ?
0
667 / 281 / 70
Регистрация: 07.01.2023
Сообщений: 1,155
08.09.2024, 17:06 12
Anton1978, например вот так
C++Выделить код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <thread>
 
class xMe {
public:
     int counter;   
     xMe(): counter(0) {}
    void add(int i) { 
    counter += i; 
}
 
};
 
// Потому что конкретно в этом примере atomic нужен как зайцу стоп-сигналы.
xMe dis;
 
xMe &operator ++(xMe &src) {
  src.add(1);
  std::cout << "dis is now " << dis.counter << std::endl;
  return src;
}
 
int main()
{
    auto threadedF = []()
    {
        for (size_t s = 0;s<1000;++s)
        {
            ++dis;
        }
    };
 
    std::thread thread01(threadedF);
    thread01.join();
 
    return 0;
}
0
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 215
08.09.2024, 18:53  [ТС] 13
Спасибо, но меня интересовало не решение любой ценой, а как использовать атомик со своим классом.
Буду искать информацию.
0
фрилансер
5843 / 5372 / 1102
Регистрация: 11.10.2019
Сообщений: 14,353
08.09.2024, 18:55 14
Anton1978, std::mutex уже потребуется
0
667 / 281 / 70
Регистрация: 07.01.2023
Сообщений: 1,155
08.09.2024, 19:08 15
Цитата Сообщение от Anton1978 Посмотреть сообщение
а как использовать атомик со своим классом.
вопрос какое действие вы хотите защитить?
Например вполне рабочий пример.
C++Выделить код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <thread>
#include <atomic>
 
class xMe {
public:
     int counter;
     xMe(): counter(0) {}
     xMe &add(int i) {
    counter += i;
    return *this;
    }
 
};
 
std::atomic<xMe> dis;
 
 
std::atomic<xMe> &operator++(std::atomic<xMe> &in) {
  in.store(in.load().add(1));
  std::cout << "dis is now " << dis.load().counter << std::endl;
  return in;
}
 
int main()
{
    auto threadedF = []()
    {
        for (size_t s = 0;s<1000;++s)
        {
            ++dis;
        }
    };
 
    std::thread thread01(threadedF);
    thread01.join();
 
    return 0;
}
Но для неинтегральных типов лучше использовать мьютексы
1
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 215
08.09.2024, 23:58  [ТС] 16
получается идея была правильной - это возможно. Проблема во мне, мне не понятна вот эта строчка
C++Выделить код
1
xMe &add(int i)
что в данном случае делает символ & ?
0
667 / 281 / 70
Регистрация: 07.01.2023
Сообщений: 1,155
09.09.2024, 09:37 17
Anton1978, слово такое, "референс" (reference) читали? Вот это он и есть. Т.е. метод add возвращает референс на объект класса xMe
1
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 215
10.09.2024, 11:30  [ТС] 18
я знаю что такое ссылка, я просто не думал что вот так можно
0
2565 / 1277 / 468
Регистрация: 08.11.2016
Сообщений: 3,525
11.09.2024, 10:25 19
Цитата Сообщение от Anton1978 Посмотреть сообщение
не думал что вот так можно
в общем "вот так вот", как привило, нужно - операторы возвращают либо тип, либо ссылку на тип для использования в цепочках операторов, например:
C++Выделить код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Foo { 
.... 
Foo & operator=(const Foo &other);
Foo & operator++();
Foo operator++(int);
Foo operator+(const Foo &other) const;
}; 
/* для Foo определены операторы сложения, постфиксного и префиксного инкремента,
а также копирующее присваивание */
 
Foo a, copy_a, b, copy_b;
copy_a = a++; // здесь постфиксный инкремент продвинет значение "a"
                     // и вернет значение копии до инкремента, которое получит
                     // оператор присваивания
 
copy_b = b = ++copy_a + a++;
1
11.09.2024, 10:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.09.2024, 10:25
Помогаю со студенческими работами здесь

Пример о необходимости std::atomic
Изучаю std::atomic. Пытаюсь сделать пример, при котором приложение упадет, без использование...

Стоит ли использовать std::atomic?
Доброго времени суток. Есть переменная в &quot;поток 2&quot; (назовем так) const volatile bool...

Расположение барьеров памяти в std::atomic
Допустим есть код #include &lt;iostream&gt; #include &lt;atomic&gt; int main() { std::atomic&lt;int&gt; a;...

Использование std::atomic вместо mutex
Добрый вечер! Правильно ли я понимаю, что если мне необходимо использовать общую переменную для...

std::atomic и реализация списка на нем
Здравствуйте, Так как такой код успешно компилируется: #include &lt;iostream&gt; #include...

Как определить / перегрузить std::iter_swap
Заранее прошу прощение, если буду использовать не правильную терминологию. Есть частичный код....

Std::atomic. Реализация свободного от блокировок стека
Всем привет. Читаю книгу Параллельное программирование на с++ в действии Энтони Уильямса, в ней он...


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

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