在Python扩展中启动线程
Starting threads within Python extensions
我试图从我的SWIG Python c++扩展中启动一个线程,然而,当我去运行它时,它产生以下内容:
libc++abi.dylib: terminating
Abort trap: 6
我猜GIL不应该有任何问题,因为没有使用python分配的对象。还是我的假设错了?
一个最小的例子:
// _MyExtension.cpp
#include <iostream>
#include <thread>
void threadFunc() {
std::cout << "Thread started" << std::endl;
std::this_thread::sleep_for (std::chrono::seconds(10));
std::cout << "Thread ended" << std::endl;
}
void start() {
std::thread first (threadFunc);
}
// _MyExtension.i
%module _MyExtension
%{
extern void start();
%}
extern void start();
// test.py
import _PyMapper
_PyMapper.start()
简单修复,线程创建后必须分离,像这样:
void start() {
std::thread first (threadFunc);
first.detach();
}
那么,它工作得很好!然而,一旦原始Python脚本中的所有语句完成,线程将过早终止。这可以通过在扩展中添加一个重新加入线程的函数调用来修复。
相关文章:
- 使用 std::string () const 函数启动线程或未来
- C++ POCO - 如何在不使用 run() 方法的情况下启动线程池上的线程?
- 使用 std::thread & std::bind 在成员函数中启动线程
- GDB 输出启动线程,但给出输出
- 尝试在我的基类中启动线程时,Visual Studio 由于调试错误而中止我的程序
- 启动线程会导致指针初始化时出现分段错误
- OMP 不启动线程
- 在关闭时升级登录中的启动线程访问违规
- 如何在dllmain中启动线程
- 如何使用媒体基础在给定时间运行/启动线程
- 如何在另一个核心上启动线程而不将处理器亲和力设置为特定核心
- Qt多线程启动线程错误
- 在构造函数中使用"this"启动线程是安全的?
- 停止,然后启动线程
- C++/Win32 我在 Windows 2000+ 上启动线程的最佳方式
- 如何在事件发生时启动线程并严格关闭其句柄
- 从 Poco::HTTPServer 启动线程
- 在成员函数上启动线程时不需要的析构函数调用
- C++线程库,在完成前两个线程后启动线程
- 使用父窗口在对象中启动线程