Hello Matt,
You can also take things one step further and use queues to send 2 pointers in one payload - first pointer would be to your data while the second is pointing to semaphore/mutex to control access. If you access your data from threads only, then mutex should work just fine. If you do some processing in the ISR then semaphore is your only option (since non-threads aren't capable of claiming a mutex).
Regards