It seems that there is a global shared context, that threads can use and access the state without the need of switching. All you need is an active SFML context on each thread. Please let me know if this is incorrect. I plan proper measures that guarantee no opengl location is written by two threads at the same time.
As far as my understanding goes from past conversations this is mostly a correct assessment. My point was mainly with regards to the SFML context per thread. You will have to handle the activation of said context in each thread yourself and AFAIK this still causes context switches.
My personal recommendation still remains that it's okay to do CPU-bound work with multiple threads (or potentially std::async or some task pool implementation), while keeping all OpenGL operations in one thread, given that the OpenGL commands will be added into a single queue anyways.
For example, if you want to load an image from disk in the background without blocking the application, you'd do the whole disk access and image decompression with
sf::Image, so you end up with the pixel information in memory and do the slow disk operations in a separate thread, but then on the main thread, you create an
sf::Texture from the image, which will load the data into the VRAM, this operation isn't the fastest, but should in most cases not cause any performance issues.
Or another example, if you're trying to render a fractal, you can split the calculation of the image data into multiple threads and serve the final image (or chunks of it) to the main thread to be rendered. (Then again that would probably best done in a shader anyways).