All standard Open Inventor action classes automatically request a global read lock on the scene graph (by calling the method SoDB::readlock()) before starting their traversal. This has the advantage that methods invoked during a traversal should be able to assume that node fields cannot change during the traversal. As a result, traversal methods must not attempt to acquire the global scene graph write lock (SoDB::writelock()). This will cause a “deadlock” where the requesting thread waits forever for the lock to be granted.
Note that this also applies to callback functions invoked by an SoCallback( C++ | Java | .NET ) node. Therefore callback functions should not attempt to modify the scene graph (it is generally dangerous to modify the scene graph during traversal even in a single-threaded application). A reasonable workaround, in most cases, is to have the callback function schedule an SoOneShotSensor( C++ | Java | .NET ) to do the modification after the traversal has been completed. |