在C中多线程调用python文件问题

jxxfqyy 2009-04-13 09:44:54
各位大虾:
小弟遇到一个问题,实在弄不明白,请各位大虾指点。
我在C中多线程调用python, 线程自然运行结束就没有问题,但是在程序里:有时,我需要强行kill线程(即子线程没有完全运行完,比如子线程在下载,但是下载到一半儿的时候,我需要退出子线程并且停止下载),我在kill线程时的操作:
PyGILState_Release( gstate ), 但是总是会出错,错误信息如下:

Fatal Python error: This thread state must be current when releasing

我在主线程的操作是:
Py_Initialize();
PyEval_InitThreads();
PyEval_ReleaseThread(PyThreadState_Get());

我在创建子线程和结束子线程时做的操作:
创建子线程时的操作:
gstate = PyGILState_Ensure( );

结束子线程时的操作:
PyGILState_Release( gstate );

小弟查看了论坛里的历史帖子,有人遇到过类似的问题,但是没有合适的回答,请熟悉python多线程编程的大虾帮小弟一把,谢谢!!



...全文
335 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Steve 2009-04-14
  • 打赏
  • 举报
回复
为何不都写到主线程里?
baobao04551 2009-04-14
  • 打赏
  • 举报
回复
在C里怎么调用python呐?
baobao04551 2009-04-14
  • 打赏
  • 举报
回复
看的不是很明白。。不过让我长见识了。。谢谢。。
jxxfqyy 2009-04-13
  • 打赏
  • 举报
回复
我好像知道问题出在哪里了,是在结束线程函数里出错了,线程结束的函数如下:
void EddThread(void)
{
pthread_kill(threadID,0);
TVPICASAi_GILStateRelease(gstate);
}

可以看出线程结束是,函数TVPICASAi_GILStateRelease(gstate);是出现在主线程里,而和它配对使用的函数:
gstate = PyGILState_Ensure( );
我是放在子线程里了,这样就不符合这两个函数一定要在同一线程里配对使用的要求了。所以就出错了。

问题我是找到了,但是我不知道该如何解决,如果我需要强行结束那个线程,只是条用下面那个函数,没有效果,也不能释放python的GIL:
pthread_kill(threadID,0);
请问大虾,我应该怎么样才能停止线程,并且释放GIL,谢谢!!

37,721

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧