title: How to release the GIL in Cython for a multithreaded C++ class?
body: <p>I have a C++ class with some methods that use std::thread that I'm making accessible to Python via Cython. Do you know where in my Cython code I'd want to put the nogill directive? Would I want to put it when I declare the class methods or when I create a Cython wrapper class? I've used the example class from the Cython docs below:</p>
  
  <p>Declaring the class:</p>
  
  <pre><code>cdef extern from "Rectangle.h" namespace "shapes":
      cdef cppclass Rectangle:
          Rectangle() except +
          Rectangle(int, int, int, int) except +
          int x0, y0, x1, y1
          int getArea()
          void getSize(int* width, int* height)
          void move(int, int)
  </code></pre>
  
  <p>Cython wrapper class:</p>
  
  <pre><code>cdef class PyRectangle:
      cdef Rectangle c_rect      # hold a C++ instance which we're wrapping
      def __cinit__(self, int x0, int y0, int x1, int y1):
          self.c_rect = Rectangle(x0, y0, x1, y1)
      def get_area(self):
          return self.c_rect.getArea()
      def get_size(self):
          cdef int width, height
          self.c_rect.getSize(&amp;width, &amp;height)
          return width, height
      def move(self, dx, dy):
          self.c_rect.move(dx, dy)
  </code></pre>