andreiavrammsd / cpp-channel

Thread-safe container for sharing data between threads
https://blog.andreiavram.ro/cpp-channel-thread-safe-container-share-data-threads/
MIT License
400 stars 28 forks source link

fix: race condition in close #37 #38

Closed bherw closed 9 months ago

bherw commented 9 months ago

Because the close method does not lock and the read method does not check the closed value after locking, it's possible for a deadlock to occur under the following series of events:

Thread 1 (reader): read last element from the channel Thread 1: call operator>> Thread 1: check closed(), which is false Thread 1: lock mutex Thread 1: check the predicate in wait() Thread 2 (writer): call close() Thread 2: set closed=true Thread 2: call cnd_.notify_all() Thread 1: calls wait() without predicate (in the implementation of the wait with predicate method)

At this point, Thread 1 waits forever because the notify_all occurred before the actual call to wait().

I don't have a good minimal test case for the issue here, but I have run it for several hours in a loop an integration test that was deadlocking before, so I'm fairly confident the issue is fixed.

andreiavrammsd commented 9 months ago

It's great when someone uses the library in the real world.

Thank you!