I'm not an expert, but here's my take on this. You should probably start by examining GeglBufferIterators (gegl/gegl/buffer/gegl-buffer-iterator.c) and how they are used by GeglProcessors (gegl/gegl/process/processor.c). While you're at it, it would also help if you can study all graph-related constructs (gegl/gegl/graph/), especially the parts on GeglVisitors (gegl/gegl/graph/gegl-visitor.c) and GeglVisitables (gegl/gegl/graph/gegl-visitable.c) and their descendants (i.e. GeglNodes and GeglPads). I suspect that these are the parts where the bulk of multi-threading should be implemented.
As to your project's relation to my work, I'm currently looking into OpenGL thread-safety. One solution that I found is to create a hidden OpenGL context after initialization and create one shared OpenGL context per thread. The other (much more attractive) solution is to do all OpenGL operations in a single rendering thread. Threads that require OpenGL operations will 'enqueue' their operations on the rendering thread.
The latter solution is better, imho, because context switching is both costly and complex.
Gegl-developer mailing list
[Video For Linux]
[Gimp on Windows]