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

8 投票
2 回答
4564 浏览
提问于 2025-04-17 08:14

我正在尝试测试一个多线程的C++动态链接库(DLL)。这个DLL应该是线程安全的。我用boost.python把它包装了一下,现在想创建多个Python线程,通过这个boost.python的包装来使用这个DLL。实际上,我是想故意制造一些线程问题。

我找不到好的文档来说明Python解释器是否支持两个线程(比如在不同的核心上)同时调用一个导入的模块,以及在这种情况下是否需要处理全局解释器锁(GIL),因为我并不想要比这个DLL本身提供的安全性更多的保护。

有没有人能给我解释一下,或者指引我去找一些关于Python如何从多个线程调用DLL模块,以及在这种情况下GIL应该如何使用的描述?

2 个回答

4

如何在通过Boost.Python从Python调用C++函数时释放GIL:

http://wiki.python.org/moin/boost.python/HowTo#Multithreading_Support_for_my_function

1

答案是否定的,GIL(全局解释器锁)在没有手动释放锁的情况下,永远无法实现真正的多线程。Python一次只允许一个线程运行,除非某个扩展手动告诉Python:“我被阻塞了,你们可以继续。” 这通常是通过在python的include/ceval.h文件中定义的Py_BEGIN_ALLOW_THREADS宏来实现的,结束时用Py_END_ALLOW_THREADS。 一旦某个扩展这样做了,Python就会允许另一个线程运行,而第一个正在执行Python代码的线程可能会引发问题(正如评论中提到的那样)。 这个机制主要是为了处理输入输出阻塞或者进行大量计算时使用。

撰写回答