std::atomic_thread_fence(std::memory_order_acquire) only works if you also have a std::atomic_thread_fence(std::memory_order_release) for which it is paired. All they do is make sure the CPU processor caches are flushed and updated between the acquire and release.
As for why to avoid them, I read they did too much and too little when dealing with threading. Too much since they flush more memory and too little since getting all the calls properly paired is extremely error prone.