python - 在 Python 扩展中启动线程

标签 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()

最佳答案

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

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

然后,它工作正常!但是,一旦原始 Python 脚本中的所有语句都已完成,线程将被过早终止。通过向重新加入线程的扩展添加函数调用可以解决此问题。

关于python - 在 Python 扩展中启动线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31280145/

相关文章:

python - 是否有与 Linux/Unix "fold"命令等效的 Vim?

c++ - MFC CPen::CreatePen 线宽

C++ 匹配括号 2 解决方案不起作用

multithreading - FPGA(Xilinx Virtex 5/7)上的线程数是多少?

python - Pandas :使用列表的子集数据框,多次保留重复项

python - 在所有 Pandas DataFrame 列和过滤器中搜索字符串

python - 我如何从另一个 python 脚本中获取导入

c++ - 检查模板参数是否有成员函数

java - 谁能解释线程监视器并等待?

java - 如何找到线程最初启动的位置