在Python扩展中启动线程

时间:2015-07-07 22:04:03

标签: python c++ multithreading swig

我正在尝试从我的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()

1 个答案:

答案 0 :(得分:0)

简单修复,线程必须在创建后分离,如下所示:

void start() {
    std::thread first (threadFunc);
    first.detach();
}

然后,它工作正常!但是,一旦在原始Python脚本中完成所有语句,就会过早地杀死该线程。通过向重新加入线程的扩展添加函数调用来解决此问题。