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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
29.03.2013, 10:24     Секундомер и thread-safe #1
В моей программе мне нужно отслеживать время по секундам. Я сделал следующее:
создал доп. поток, в котором вызывается методом с телом:
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
Посмотрите здесь:

секундомер C++
Секундомер. C++
C++ Секундомер на С++
thread-safe ли? C++
Секундомер C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 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++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
29.03.2013, 12:25     Секундомер и thread-safe #4
Цитата Сообщение от nexen Посмотреть сообщение
Из главного потока я, переодически, вызываю GetTime() для просмотра времени, но беспокоят две вещи:
Какой смысл от такого вызова? Вы вызываете по какому-то графику?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 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
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
29.03.2013, 15:06     Секундомер и thread-safe #9
Цитата Сообщение от nexen Посмотреть сообщение
что мне это даст
Ну, с интом профит не большой. Но по сути, это позволяет избежать копирования.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 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++
3582 / 1362 / 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++
3582 / 1362 / 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
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
29.03.2013, 19:43  [ТС]     Секундомер и thread-safe #15
go, почему не будет? Присваивание разве не атомарная операция?
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
29.03.2013, 20:02     Секундомер и thread-safe #16
Цитата Сообщение от nexen Посмотреть сообщение
Не важно, что сейчас могло пройти 19.999 секунды, а таймер выдаст 19
Сейчас будет 20. Таймер попытается изменить с 19 на 20. В этот момент мы пытаемся взять время... Дальше сами додумаете? Таймер выдаст 19. Ну это как вариант.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
29.03.2013, 20:08  [ТС]     Секундомер и thread-safe #17
go,
Цитата Сообщение от nexen Посмотреть сообщение
Присваивание разве не атомарная операция?
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
29.03.2013, 22:51     Секундомер и thread-safe #18
Цитата Сообщение от nexen Посмотреть сообщение
uint_64
Цитата Сообщение от nexen Посмотреть сообщение
Присваивание разве не атомарная операция?
Есть много факторов, которое влияют. Поэтому ответ нет. Вам нужна критическая секция. char точно будет атомарно. Поэтому можете поменять тип. Например, компилятор по умолчанию int выравнивает по границе слова. Но я не знаю как будет у Вас. Как уже отметил выше, атомарность присутствует точно только с char.

Добавлено через 7 минут
Цитата Сообщение от go Посмотреть сообщение
Например, компилятор по умолчанию int выравнивает по границе слова. Но я не знаю как будет у Вас.
Я же не знаю какая у Вас разрядность системы.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
30.03.2013, 11:59  [ТС]     Секундомер и thread-safe #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* могу сослаться?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2013, 14:09     Секундомер и thread-safe
Еще ссылки по теме:

C++ Thread-safe ли чтение структур?
C++ Boost::thread vs std::thread
Vector и thread-safe C++

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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.03.2013, 14:09     Секундомер и thread-safe #20
Цитата Сообщение от nexen Посмотреть сообщение
Выходит, что с новой декларацией появились копии оригинальных типов, которые гарантируют атомарность указанных в статье операций и, чтобы создать экземпляр, нужно всего-лишь добавить atomic_?
да
Цитата Сообщение от nexen Посмотреть сообщение
А для double/float такого нет?
нет
Цитата Сообщение от nexen Посмотреть сообщение
Что насчет указателей? Я могу сделать std::atomic<P*> - где P* - только указатель на тип atomic_smthng или же и на MyClass* могу сослаться?
да
Yandex
Объявления
30.03.2013, 14:09     Секундомер и thread-safe
Ответ Создать тему
Опции темы

Текущее время: 01:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru