Given two threads running on different cores each of which has a copy of an identical pointer to a shared variable, does that raise any issue if both threads are guaranteed to only read this variable? I'm not using any kind of mutex...
guaranteed to only read it, and no-one else writes to it, then you're good.
The problem comes when any thread is reading from a variable while some other thread is writing to it, a consideration that occurs surprisingly often in practice.
For some reason cache coherency has popped up as a big topic. Regardless, if you have a thread that has a pointer to a variable, your compiled program will dereference that pointer to get the memory address of the variable and will read from it. Cache coherency doesn't stop the reads from working, even if 2 threads access it. Performance may suffer, depending how the CPU manages cached pages - the CPU will still have to read the page containing the variable, and will probably cache it, there will be no difference here than reading a global variable or one allocated on the heap. Your C++ program doesn't know about cache lines, the compiled machine instructions don't know about C++ variables. From what i understand, a cache line in x86 is 64 bytes, and whilst its true that writing to a memory address that is next to your shared variable will cause the CPU to update its cache (ie re-read the variable into CPU cache) its still no worse than using any other global variable.
If you are reading this variable continually, and are worried about performance, it would be better to take a local copy in each thread. If no-one is ever going to update the surrounding 64-bytes of memory then there's no point. You will want to measure any performance impact if you are worried.