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

Race condition between close/read leads to deadlock #37

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().

bherw commented 9 months ago

I don't have a good minimal test case for this, but it shows up often enough in our integration tests--maybe one in 500-600 usages of the channel.