187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|||||||||||
1 | |||||||||||
Секундомер и thread-safe29.03.2013, 10:24. Показов 2375. Ответов 19
Метки нет (Все метки)
В моей программе мне нужно отслеживать время по секундам. Я сделал следующее:
создал доп. поток, в котором вызывается методом с телом:
Так же у этого класса есть метод:
1) Есть ли недостатки у такого метода реализации? Возможно, гораздо правильнее была бы другая реалзицаия? Если да, то какая? (учитывайте, что мне нужно кол-во секунд. Не важно, что сейчас могло пройти 19.999 секунды, а таймер выдаст 19). 2) Thread-safe ли метод GetTime? Иначе говоря, return может считаться цельной транзакцией?
0
|
29.03.2013, 10:24 | |
Ответы с готовыми решениями:
19
thread-safe ли? Vector и thread-safe Что такое thread safe? Thread-safe ли чтение структур? |
Каратель
|
|
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
|
Каратель
|
|
29.03.2013, 12:27 | 5 |
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
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
29.03.2013, 14:55 [ТС] | 8 |
Tulosba, в каком смысле?
const uint_64& GetTime() const; ? Если да, то что мне это даст, нежели uint_64 - возвращение? Изменять время извне я не собираюсь пока что
0
|
29.03.2013, 17:22 | 10 | |||||
Как по мне, то здесь можно воспользоваться обычными мютексами для защиты переменной. Если я правильно понял суть, то при запуске каждого потока к переменной нужно будет добавить количество пройденных секунд. Вот пример накидал:
1
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
29.03.2013, 17:37 [ТС] | 11 |
yuron_477, теперь я начинаю понимать, за что ненавидят C++ >_> Абсолютно нечитаемый для меня код.. Эх, позже разбераться придется
0
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
29.03.2013, 19:00 [ТС] | 13 |
go, ага, скудное семество из 4ех, включающих сравнение, прибавление и ещё что-то..
Вопрос стоял не в том "как синхронизировать потоки", а "будет ли thread-safe этот метод". Почему каждый раз на "вопрос в лоб" отвечают каким-то "касательным" ответом?
0
|
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
|
|
29.03.2013, 19:10 | 14 |
nexen, потому что код мягко говоря не очень.
Ладно. Нет! Добавлено через 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
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
29.03.2013, 20:08 [ТС] | 17 |
0
|
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
|
|
29.03.2013, 22:51 | 18 |
Есть много факторов, которое влияют. Поэтому ответ нет. Вам нужна критическая секция. char точно будет атомарно. Поэтому можете поменять тип. Например, компилятор по умолчанию int выравнивает по границе слова. Но я не знаю как будет у Вас. Как уже отметил выше, атомарность присутствует точно только с char.
Добавлено через 7 минут Я же не знаю какая у Вас разрядность системы.
1
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|||||||||||
30.03.2013, 11:59 [ТС] | 19 | ||||||||||
go, иначе говоря, атомарность 100% присутствует с типами, чей размер меньше машинного слова (или равен)? Даже с дробными?
Добавлено через 3 часа 53 минуты Jupiter, посмотрел про atomic. Выходит, что с новой декларацией появились копии оригинальных типов, которые гарантируют атомарность указанных в статье операций и, чтобы создать экземпляр, нужно всего-лишь добавить atomic_? Иначе говоря:
А для double/float такого нет? Что насчет указателей? Я могу сделать std::atomic<P*> - где P* - только указатель на тип atomic_smthng или же и на MyClass* могу сослаться?
0
|
Каратель
|
|
30.03.2013, 14:09 | 20 |
1
|
30.03.2013, 14:09 | |
30.03.2013, 14:09 | |
Помогаю со студенческими работами здесь
20
Thread-safe smart pointer Синхронизация потоков, thread-safe usleep В чем загвоздка с non-thread safe lazy singleton? Непонятки в Java. Chain method call. Thread.start() vs Thread.run() Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |