Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

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

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

В моей программе мне нужно отслеживать время по секундам. Я сделал следующее:
создал доп. поток, в котором вызывается методом с телом:
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 может считаться цельной транзакцией?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2013, 10:24     Секундомер и thread-safe
Посмотрите здесь:

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

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

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

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

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

C++11. thread, mutex, thread-safety - C++
есть функция, которая стартует 2 потока: для отлова нажатия клавиш и для выполнения действий void Trainer::start() { const HANDLE...

Секундомер на С++ - C++
Добрый день. Подскажите, как написать простейший консольный секундомер на с++ без использования сторонних библиотек. Нужно, чтобы при...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
29.03.2013, 10:41     Секундомер и thread-safe #2
std::atomic для second, а вообще лучше используйте таймер
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
29.03.2013, 12:03  [ТС]     Секундомер и thread-safe #3
Jupiter, ничего с atomic не понял, но спасибо
А таймеры использовать нельзя, ибо на секундомер нужно будет повесить ещё парочку функций, из-за чего нужно именно собственоручное прибавление +1 секунды.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
29.03.2013, 12:25     Секундомер и thread-safe #4
Цитата Сообщение от nexen Посмотреть сообщение
Из главного потока я, переодически, вызываю GetTime() для просмотра времени, но беспокоят две вещи:
Какой смысл от такого вызова? Вы вызываете по какому-то графику?
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
29.03.2013, 12:27     Секундомер и thread-safe #5
Цитата Сообщение от nexen Посмотреть сообщение
ничего с atomic не понял, но спасибо
http://ru.wikipedia.org/wiki/%D0%90%...86%D0%B8%D1%8F
так вот seconds следует сделать атомарной
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
29.03.2013, 13:47  [ТС]     Секундомер и thread-safe #6
Jupiter, я понимаю, что такое атомарные операции, просто я вообще впервые вижу atomic, никогда не знал, что можно сделать программно атомарную операцию, а с аниглийского описания вообще ничего не понял :<

Добавлено через 1 минуту
go, вызываю для проверки времени. Конечно, выглядит глупо, но давать доступ к полю не хочу (принципиально :< )
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
29.03.2013, 14:48     Секундомер и thread-safe #7
Цитата Сообщение от nexen Посмотреть сообщение
давать доступ к полю не хочу
Можно и по константной ссылке возвращать.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
29.03.2013, 14:55  [ТС]     Секундомер и thread-safe #8
Tulosba, в каком смысле?
const uint_64& GetTime() const; ? Если да, то что мне это даст, нежели uint_64 - возвращение? Изменять время извне я не собираюсь пока что
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
29.03.2013, 15:06     Секундомер и thread-safe #9
Цитата Сообщение от nexen Посмотреть сообщение
что мне это даст
Ну, с интом профит не большой. Но по сути, это позволяет избежать копирования.
DiffEreD
1429 / 766 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
29.03.2013, 17:22     Секундомер и thread-safe #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;
}
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
29.03.2013, 17:37  [ТС]     Секундомер и thread-safe #11
yuron_477, теперь я начинаю понимать, за что ненавидят C++ >_> Абсолютно нечитаемый для меня код.. Эх, позже разбераться придется
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
29.03.2013, 18:39     Секундомер и thread-safe #12
nexen, есть целое семейство interlocked-функций. А вообще используйте критическую секцию для синхронизации потоков.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
29.03.2013, 19:00  [ТС]     Секундомер и thread-safe #13
go, ага, скудное семество из 4ех, включающих сравнение, прибавление и ещё что-то..
Вопрос стоял не в том "как синхронизировать потоки", а "будет ли thread-safe этот метод". Почему каждый раз на "вопрос в лоб" отвечают каким-то "касательным" ответом?
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
29.03.2013, 19:10     Секундомер и thread-safe #14
nexen, потому что код мягко говоря не очень.
Цитата Сообщение от nexen Посмотреть сообщение
будет ли thread-safe этот метод
Ладно. Нет!

Добавлено через 1 минуту
Как исправить вам уже сказали. А вообще вот не плохая статья http://wm-help.net/books-online/book.../59464-28.html
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2013, 19:43     Секундомер и thread-safe
Еще ссылки по теме:

Секундомер. - C++
Знаю подобные темы уже рассматривались на форуме, но ни в одной из них я не нашел ответа мой вопрос... Как организовать секундомер что бы...

Секундомер - C++
Сделал такой небольшой код, что-то на подобии теста на сколько быстро вы печатаете. Никак до меня не дойдет как сюда секундомер влепить?...

Секундомер - C++
Доброго времени суток. Проверьте пожалуйста программу, работающую аналогично секундомеру. Вот я сделал программу С++, но не...

секундомер - C++
Здравствуйте госпола програмисты!У меня такой вопрос-как сделать секундомер,что бы он не зависел от программы?грубо говоря он находиться в...

Секундомер - C++
Народ нужна помощь Задачка такая: нужно сделать Секундомер как в электронных часах ввиде: 00:00 когда будет 00:59 нужно что бы...


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

Или воспользуйтесь поиском по форуму:
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
29.03.2013, 19:43  [ТС]     Секундомер и thread-safe #15
go, почему не будет? Присваивание разве не атомарная операция?
Yandex
Объявления
29.03.2013, 19:43     Секундомер и thread-safe
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru