Is the C++ std::set thread-safe?

前端 未结 6 982
刺人心
刺人心 2020-11-28 12:34

I\'ve a question about the thread safety of std::set.

As far as I know I can iterate over a set and add/erase members and that doesn\'t invalidate the iterators.

相关标签:
6条回答
  • 2020-11-28 12:57

    The Dinkumware STL-Documentation contains the follwing paragraph about that topic. Its probably (as indicated in the text) valid for most implementations.

    For the container objects defined in the Standard C++ Library, such as STL Containers and objects of template class basic_string, this implementation follows the widely adopted practices spelled out for SGI STL:

    Multiple threads can safely read the same container object. (There are nunprotected mutable subobjects within a container object.)

    Two threads can safely manipulate different container objects of the same type. (There are no unprotected shared static objects within a container type.)

    You must protect against simultaneous access to a container object if at least one thread is modifying the object. (The obvious synchronization primitives, such as those in the Dinkum Threads Library, will not be subverted by the container object.)

    Thus, no attempt is made to ensure that atomic operations on container objects are thread safe; but it is easy enough to make shared container objects that are thread safe at the appropriate level of granularity.

    0 讨论(0)
  • 2020-11-28 13:01

    None of the STL containers is thread safe, so std::set in particular isn’t.

    In your case, the issue isn’t even really thread safety, though: You simply share an object across multiple threads (fine) and modify it in one thread (fine as well). But as you’ve already said, modifying the container invalidates its iterators. Whether this happens in the same thread or in a different thread is of no consequence since it’s still the same container.

    D'oh! §23.1.2.8 states that inserting doesn’t invalidate iterators.

    0 讨论(0)
  • 2020-11-28 13:05

    STL has no built in thread support, so you'll have to extend the STL code with your own synchronization mechanisms to use STL in a multithreaded environment.

    For example look here: link text

    Since set is a container class MSDN has following to say about the thread safety of the containers.

    A single object is thread safe for reading from multiple threads. For example, given an object A, it is safe to read A from thread 1 and from thread 2 simultaneously.

    If a single object is being written to by one thread, then all reads and writes to that object on the same or other threads must be protected. For example, given an object A, if thread 1 is writing to A, then thread 2 must be prevented from reading from or writing to A.

    It is safe to read and write to one instance of a type even if another thread is reading or writing to a different instance of the same type. For example, given objects A and B of the same type, it is safe if A is being written in thread 1 and B is being read in thread 2.

    0 讨论(0)
  • 2020-11-28 13:05

    Performing an insertion can cause the vector to reallocate its underlying memory while iterator may still point to the previous (but invalid) memory address, leading to segment fault.

    0 讨论(0)
  • 2020-11-28 13:12

    Simple explanation: If thread A is moving iterators through the container, it's looking at container internals. If thread B modifies the container (even an operation that doesn't invalidate the iterator that A has), thread A can run into trouble because B is fooling with the container internals, possibly having them in a (temporarily) invalid state. This causes crashes in thread A.

    The problem ISN'T the iterators themselves. It when they need the container's data structures in order to find the position that you get into trouble.

    Simple as that.

    0 讨论(0)
  • 2020-11-28 13:13

    Yes. One way to handle this situation is to have each thread lock a shared mutex before accessing the same set object. Make sure you use RAII techniques to lock and unlock the mutex.

    0 讨论(0)
提交回复
热议问题