使用boost.python实现真正的多线程

8
我正在尝试测试一个多线程的 C++ DLL。这个 DLL 应该是线程安全的。我已经用 boost.python 将其包装起来,并且我想通过 boost.python 包装器创建多个 Python 线程来调用 DLL。实际上,我“试图”引发线程问题。
我似乎找不到关于 Python 解释器是否支持两个线程(在不同的内核上)同时调用导入模块的良好文档,以及在这种情况下 GIL 是否需要保护,因为我不想提供 DLL 已经提供的任何额外的安全性。
有人能否描述或引荐一下 Python 如何从多个线程调用 DLL 模块以及在这种情况下应该如何使用 GIL 的说明?

显然,您将不得不自己释放GIL,否则您一次只能运行一个线程。请参见https://dev59.com/MknSa4cB1Zd3GeqPRdRf - lvella
1
这是 https://dev59.com/q1zUa4cB1Zd3GeqP7uYh 的重复吗? - Matthew Scouten
一个副问题:如果我不释放GIL,并且从Python调用的C++代码创建了一个线程,这个线程能否安全地调用Python代码。我认为不能,因为这可能会导致崩溃。 - MatthieuW
2个回答

4

1
答案是否定的,除非DLL手动释放锁,否则GIL永远不会真正地多线程。Python一次只允许一个线程运行,除非扩展程序手动指示“我被阻塞了,请继续进行”。在python的include / ceval.h中定义了Py_BEGIN_ALLOW_THREADS宏(并由Py_END_ALLOW_THREADS撤消),通常使用这种方法。一旦扩展程序执行此操作,Python将允许另一个线程运行,而执行任何Python任务的第一个线程可能会引起问题(正如注释问题所指出的那样) 。 它确实适用于在I / O上阻止或进入重型计算时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接