Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple vector writers without locking

I have a few threads writing in a vector. It's possible that different threads try to write the same byte. There is no reads. Can I use only an atomic_fecth_or(), like in the example, so the vector will become thread safe? It compiled with GCC without errors or warnings.

    std::vector<std::atomic<uint8_t>> MapVis(1024*1024); 

    void threador()
    {
    ...
    std::atomic_fetch_or(&MapVis[i], testor1); 
    }
like image 721
Ribeiro Silva Avatar asked May 11 '26 13:05

Ribeiro Silva


1 Answers

It compiled with GCC without errors or warnings

That doesn't mean anything because compilers don't perform that sort of concurrency analysis. There are dedicated static analysis tools that may do this with varying levels of success.

Can I use only an atomic_fetch_or ...

you certainly can, and it will be safe at the level of each individual std::atomic<uint8_t>.

... the vector will become thread safe?

it's not sufficient that each element is accessed safely. You specifically need to avoid any operation that invalidates iterators (swap, resize, insert, push_back etc.).

I'd hesitate to say vector is thread-safe in this context - but you're limiting yourself to a thread-safe subset of its interface, so it will work correctly.


Note that as VTT suggests, keeping a separate partial vector per thread is better if possible. Partly because it's easier to prove correct, and partly because it avoids false sharing between cores.

like image 130
Useless Avatar answered May 14 '26 02:05

Useless



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!