2015-07-07 4 views
3

Я пытаюсь запустить поток из моей SWIG Python C++ расширения, однако, когда я иду, чтобы запустить его производит следующее:Стартовые потоки внутри расширений Python

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

ответ

0

Простое исправление, нить должна быть отсоединена после создания, например, так:

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

Затем, он отлично работает! Тем не менее, поток будет убит преждевременно, как только все утверждения будут завершены в исходном скрипте Python. Это фиксируется добавлением вызова функции к вашему расширению, которое присоединяется к потоку.

Смежные вопросы