1

This question asks if const means thread-safe, which Herb Sutter's You don't know const and mutable talk answers well. But what about the opposite direction? If a function is thread-safe, should it thereby be marked const? If not, when should a function be marked const?

Community
  • 1
  • 1
Shea Levy
  • 5,237
  • 3
  • 31
  • 42
  • You can easily construct a function that modifies state and is still thread-safe by providing appropriate synchronization mechanisms. It doesn't necessarily have to be `const`, unless I completely misunderstood your question – Alejandro Apr 22 '15 at 03:08

1 Answers1

1

No, it's perfectly possible for a method to be non const but still be thread safe. Either it uses atomics, or a lock to protect member variables. For example, the count() method below is thread safe, whilst modifying the m_count member variable.

#include <iostream>
#include <mutex>

class Counter
{
public:
    Counter() : m_counterMutex(), m_counter(0) {}
    unsigned int count() {
        std::lock_guard<std::mutex> lk(m_counterMutex);
        ++m_counter;
        return m_counter;
    }
private:
    std::mutex m_counterMutex;
    unsigned int m_counter;

};

It shouldn't be marked as const because the visible state has changed. It would surprise to users of the class that they could pass a const Counter& object to a function and the visible state of the object could be changed by that function.

Steve
  • 7,171
  • 2
  • 30
  • 52
  • This is where I ended up too. It seems the real lesson of the talk is "const things should be logically const and thread-safe", not just "const should be thread-safe" – Shea Levy Apr 27 '15 at 23:12