We use a similar mechanism, but it is thread-local. Handles get passed to other threads, but the other threads cannot directly access them; instead, they send requests associated with the handle to the owning thread over an MPSC queue. Our construct is not a general purposes replacement for pointers, obviously.