On 6 Feb 2015 at 13:41, Gottlob Frege wrote:
The easiest solution would be to store the slot as a shared_ptr, and make a copy of it (pin it) each time you call the slot.
So
Thread 1: call signal,... copy slot shared_ptr,... Thread 2: disconnect, clean up resources, set global ptrUsedBySlot = null (since it is no longer used, right?) Thread 1: call slot Thread 1: crash on null ptrUsedBySlot
shared_ptr provides some atomic_exchange overloads. You could atomically swap a slot being deleted with an empty but valid slot type which calls nothing. You'd see some fragmentation over time, but to be honest if the slots array fits into an L1 cache you actually don't care. My concurrent_unordered_map keeps a linear array of hashes and pointers to items and simply scans them. Deletion means poking a zero into the pointer, insertion tries to fill a zero slot before bothering with extension. It's very quick, within 20% of a std::unordered_map. Niall -- ned Productions Limited Consulting http://www.nedproductions.biz/ http://ie.linkedin.com/in/nialldouglas/