我正在尝试测试多线程C ++ DLL。这个DLL应该是线程安全的。我用boost.python包装它,我想创建多个python线程来通过boost.python包装器来运行DLL。我实际上尝试导致线程问题。
我似乎无法找到好的文档是python解释器是否支持它的两个线程(比如说在不同的核心上)同时调用一个导入的模块,以及GIL是否需要根据我的需要进行管理不希望任何增加的安全性高于DLL应该提供的安全性。
有人能描述或引用我从多个线程调用DLL模块的python的描述以及如何在这种情况下使用GIL吗?
答案 0 :(得分:4)
如何通过Boost.Python从Python调用C ++函数时释放GIL:
http://wiki.python.org/moin/boost.python/HowTo#Multithreading_Support_for_my_function
答案 1 :(得分:1)
答案是否定的,除非DLL手动释放锁,否则GIL永远不会真正多线程。 Python允许一次只运行一个线程,除非扩展手动说“我被阻止,继续没有我”。这通常使用python的include / ceval.h中定义的Py_BEGIN_ALLOW_THREADS宏(以及使用Py_END_ALLOW_THREADS撤消)来完成。一旦扩展执行此操作,python将允许另一个线程运行,并且执行任何python内容的第一个线程可能会导致问题(如注释问题所述)。这实际上意味着阻塞I / O或进入大量计算时间。