Skip to content

Dynamic bitset is not thread safe #240

Open
@JohanMabille

Description

@JohanMabille

Let's say we have two thread writing values into a dynamic bitset. If the thread tries to change bits stored in the same underlying integer, we may have a race condition in the following code:

    template <class B, bool C>
    inline void xbitset_reference<B, C>::set() noexcept
    {
        m_block |= m_mask;
    }

This line is equivalent to m_block = m_block | m_mask.

Here m_block is a reference to the underlying integer used to store a group of bits. The issue is that Thread_1 may compute m_block | m_mask then Thread_2 computes m_block | m_mask and assigns it to m_block. Then Thread_1 writes m_block and overwrites the bit previously computed by Thread_2.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions