Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
1

Секундомер и thread-safe

29.03.2013, 10:24. Показов 2377. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В моей программе мне нужно отслеживать время по секундам. Я сделал следующее:
создал доп. поток, в котором вызывается методом с телом:
C++
1
2
3
4
5
while(true)
{
++seconds;
Sleep(1000);
}
, где seconds - поле класса.
Так же у этого класса есть метод:
C++
1
2
3
4
uint_64 GetTime() const
{
return seconds;
}
Из главного потока я, переодически, вызываю GetTime() для просмотра времени, но беспокоят две вещи:
1) Есть ли недостатки у такого метода реализации? Возможно, гораздо правильнее была бы другая реалзицаия? Если да, то какая? (учитывайте, что мне нужно кол-во секунд. Не важно, что сейчас могло пройти 19.999 секунды, а таймер выдаст 19).
2) Thread-safe ли метод GetTime? Иначе говоря, return может считаться цельной транзакцией?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2013, 10:24
Ответы с готовыми решениями:

thread-safe ли?
Насколько я понимаю, для х32 процессоров атомарными операциями не являются те, что с double/long...

Vector и thread-safe
Как лучше сделать свой класс типа контейнер шаблонный как вектор который будет ещё и thread-safe....

Что такое thread safe?
Всем добрый день! Вопрос, собственно, в имени темы.:) Что это такое? Я так понимаю, что...

Thread-safe ли чтение структур?
Собственно, безопасно ли нескольким потокам одновременно читать значение глобальной переменной,...

19
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
29.03.2013, 10:41 2
std::atomic для second, а вообще лучше используйте таймер
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
29.03.2013, 12:03  [ТС] 3
Jupiter, ничего с atomic не понял, но спасибо
А таймеры использовать нельзя, ибо на секундомер нужно будет повесить ещё парочку функций, из-за чего нужно именно собственоручное прибавление +1 секунды.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
29.03.2013, 12:25 4
Цитата Сообщение от nexen Посмотреть сообщение
Из главного потока я, переодически, вызываю GetTime() для просмотра времени, но беспокоят две вещи:
Какой смысл от такого вызова? Вы вызываете по какому-то графику?
1
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
29.03.2013, 12:27 5
Цитата Сообщение от nexen Посмотреть сообщение
ничего с atomic не понял, но спасибо
http://ru.wikipedia.org/wiki/%... 0%B8%D1%8F
так вот seconds следует сделать атомарной
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
29.03.2013, 13:47  [ТС] 6
Jupiter, я понимаю, что такое атомарные операции, просто я вообще впервые вижу atomic, никогда не знал, что можно сделать программно атомарную операцию, а с аниглийского описания вообще ничего не понял :<

Добавлено через 1 минуту
go, вызываю для проверки времени. Конечно, выглядит глупо, но давать доступ к полю не хочу (принципиально :< )
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
29.03.2013, 14:48 7
Цитата Сообщение от nexen Посмотреть сообщение
давать доступ к полю не хочу
Можно и по константной ссылке возвращать.
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
29.03.2013, 14:55  [ТС] 8
Tulosba, в каком смысле?
const uint_64& GetTime() const; ? Если да, то что мне это даст, нежели uint_64 - возвращение? Изменять время извне я не собираюсь пока что
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
29.03.2013, 15:06 9
Цитата Сообщение от nexen Посмотреть сообщение
что мне это даст
Ну, с интом профит не большой. Но по сути, это позволяет избежать копирования.
0
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
29.03.2013, 17:22 10
Как по мне, то здесь можно воспользоваться обычными мютексами для защиты переменной. Если я правильно понял суть, то при запуске каждого потока к переменной нужно будет добавить количество пройденных секунд. Вот пример накидал:
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
#include <iostream>
#include <vector>
#include <thread>
#include <chrono>
#include <mutex>
 
class timer
{
    unsigned seconds_ = 0;
    mutable std::mutex m;
public:
    unsigned gettime() const 
    {
        std::unique_lock<std::mutex> lock(m);
        return seconds_;
    }
    
    void timer_on(const unsigned sec)
    {
        std::unique_lock<std::mutex> lock(m);
        auto start = std::chrono::high_resolution_clock::now();
        std::this_thread::sleep_for(std::chrono::seconds(sec));
        seconds_ += std::chrono::duration_cast<std::chrono::seconds>(std::chrono::high_resolution_clock::now() - start).count();
    }
};
 
int main() 
{
    timer my_timer;
    std::vector<std::thread> threads(10);
    for (auto& i : threads) i = std::thread(&timer::timer_on, &my_timer, 3); //запускаем 10 потоков и ждем 30 секунд
    for (auto& i : threads) i.join();  //ждем завершения потоков (в результате переменная timer::seconds_ должна быть равной 30)
    std::cout<<"total time: "<<my_timer.gettime()<<" seconds\n";
    
    return 0;
}
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
29.03.2013, 17:37  [ТС] 11
yuron_477, теперь я начинаю понимать, за что ненавидят C++ >_> Абсолютно нечитаемый для меня код.. Эх, позже разбераться придется
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
29.03.2013, 18:39 12
nexen, есть целое семейство interlocked-функций. А вообще используйте критическую секцию для синхронизации потоков.
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
29.03.2013, 19:00  [ТС] 13
go, ага, скудное семество из 4ех, включающих сравнение, прибавление и ещё что-то..
Вопрос стоял не в том "как синхронизировать потоки", а "будет ли thread-safe этот метод". Почему каждый раз на "вопрос в лоб" отвечают каким-то "касательным" ответом?
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
29.03.2013, 19:10 14
nexen, потому что код мягко говоря не очень.
Цитата Сообщение от nexen Посмотреть сообщение
будет ли thread-safe этот метод
Ладно. Нет!

Добавлено через 1 минуту
Как исправить вам уже сказали. А вообще вот не плохая статья http://wm-help.net/books-onlin... 64-28.html
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
29.03.2013, 19:43  [ТС] 15
go, почему не будет? Присваивание разве не атомарная операция?
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
29.03.2013, 20:02 16
Цитата Сообщение от nexen Посмотреть сообщение
Не важно, что сейчас могло пройти 19.999 секунды, а таймер выдаст 19
Сейчас будет 20. Таймер попытается изменить с 19 на 20. В этот момент мы пытаемся взять время... Дальше сами додумаете? Таймер выдаст 19. Ну это как вариант.
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
29.03.2013, 20:08  [ТС] 17
go,
Цитата Сообщение от nexen Посмотреть сообщение
Присваивание разве не атомарная операция?
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
29.03.2013, 22:51 18
Цитата Сообщение от nexen Посмотреть сообщение
uint_64
Цитата Сообщение от nexen Посмотреть сообщение
Присваивание разве не атомарная операция?
Есть много факторов, которое влияют. Поэтому ответ нет. Вам нужна критическая секция. char точно будет атомарно. Поэтому можете поменять тип. Например, компилятор по умолчанию int выравнивает по границе слова. Но я не знаю как будет у Вас. Как уже отметил выше, атомарность присутствует точно только с char.

Добавлено через 7 минут
Цитата Сообщение от go Посмотреть сообщение
Например, компилятор по умолчанию int выравнивает по границе слова. Но я не знаю как будет у Вас.
Я же не знаю какая у Вас разрядность системы.
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
30.03.2013, 11:59  [ТС] 19
go, иначе говоря, атомарность 100% присутствует с типами, чей размер меньше машинного слова (или равен)? Даже с дробными?

Добавлено через 3 часа 53 минуты
Jupiter, посмотрел про atomic. Выходит, что с новой декларацией появились копии оригинальных типов, которые гарантируют атомарность указанных в статье операций и, чтобы создать экземпляр, нужно всего-лишь добавить atomic_? Иначе говоря:
C++
1
2
long long x = 10; 
x = 20; // не thread-safe
C++
1
2
std::atomic_llong x = 10; 
x = 20; // thread-safe
?
А для double/float такого нет?
Что насчет указателей? Я могу сделать std::atomic<P*> - где P* - только указатель на тип atomic_smthng или же и на MyClass* могу сослаться?
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
30.03.2013, 14:09 20
Цитата Сообщение от nexen Посмотреть сообщение
Выходит, что с новой декларацией появились копии оригинальных типов, которые гарантируют атомарность указанных в статье операций и, чтобы создать экземпляр, нужно всего-лишь добавить atomic_?
да
Цитата Сообщение от nexen Посмотреть сообщение
А для double/float такого нет?
нет
Цитата Сообщение от nexen Посмотреть сообщение
Что насчет указателей? Я могу сделать std::atomic<P*> - где P* - только указатель на тип atomic_smthng или же и на MyClass* могу сослаться?
да
1
30.03.2013, 14:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.03.2013, 14:09
Помогаю со студенческими работами здесь

Thread-safe smart pointer
Нужно мне это для реализации COW механизма. В STL, насколько я понимаю, shared_ptr такого не...

Синхронизация потоков, thread-safe usleep
Постановка задачи: Создать 2N+1 потоков. N потоков пишут в общий буфер (далее ОБ), N + 1 потоков...

В чем загвоздка с non-thread safe lazy singleton?
public class NonThreadSafeSingleton { private static NonThreadSafeSingleton instance; ...

Непонятки в Java. Chain method call. Thread.start() vs Thread.run()
Ребят, кто знает подскажите, изучаю Java уже 4 месяца, а до меня все не доходит вот к примеру такая...


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

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