2015-11-14 5 views
-1

Я пытаюсь реализовать счетчик int, который всегда увеличивается на один поток (Thread1) и всегда уменьшается на другой (Thread2).Thread safe counter C++ 11

одним из вариантов является использование std::atomic<int>.

Хотя у меня есть другая идея, где у меня есть две переменные: counterIncr и counterDecr. Thread1 всегда увеличивает counterIncr, а Thread2 всегда уменьшает counterDecr.

И я буду использовать сумму (counterIncr+counterDecr) в качестве окончательного результата.

Имеет ли это какое-либо преимущество в производительности? Это безжизненно?

+2

Обычно лучше использовать потоки ресурсов, которые не используются совместно. Но когда вы возьмете сумму? После окончания резьбы? –

+0

зависит от того, когда и где вычисляется конечный результат. – Minato

+0

Hi Anon. Сумма всегда будет использоваться 'Thread1' – ashwin929

ответ

3

Если вам нужен результат, доступный в любое время, то правильно использовать std::atomic, и если вам нужен только «счетчик», достаточно std::memory_order_relaxed, что достаточно эффективно.
Помните, что у вас все еще есть значительный накладные расходы на шину, поэтому, если вы делаете миллионы приращений, это может стать ограничивающим фактором. Не делайте этого, если вы не ожидаете всего несколько сотен приростов (в этом случае это не имеет значения), или если вы действительно действительно должны должны уметь читать значение в любое время.

Если вам нужно получить окончательный результат после выполнения многих вычислений, гораздо предпочтительнее присоединить два потока (или заблокировать их или передать основной поток, который вы сделали, и больше не записывать на счетчики) и каждый поток обновляет только счетчик потока для каждой нити неатомно. Вы можете использовать привязку привязки или привязку к каждой ссылке, чтобы поток потребления имел «легкий» доступ к результату.
Это не забивает автобус и будет работать намного быстрее, но, конечно, у вас есть только действительный результат, доступный в конце, а не какое-то время до этого.

+0

Спасибо, мне нужно получить значение в любое время, и, к сожалению, счетчик может легко быть в порядке миллионов. Поэтому я предполагаю, что использование std :: atomic - путь. – ashwin929