关于多线程编程如果结束线程的问题。

小塔-皂荚花 2014-09-01 02:28:24
我是想在主线程中结束另一个线程的运行,本来是可以使用pthread_cancel解决的,但是这个东西移植Android的时候是没有实现的函数,所以我采用了信号的方式,使用pthread_kill发送信号给线程然后结束这个线程,代码如下,打印的结果显示信号发送成功,但是另一个线程却没有收到信号,不知道什么原因,请赐教。

bool HelloWorld::init()

{

//////////////////////////////

// 1. super init first

if ( !Layer::init() )

{

return false;

}



auto item = MenuItemImage::create("CloseNormal.png","CloseSelected.png",CC_CALLBACK_1(HelloWorld::menuCallback,this));

auto menu = Menu::create(item,nullptr);

this->addChild(menu);



return true;

}



void HelloWorld::onEnter()

{

Layer::onEnter();



pthread_create(&thread_id,nullptr,threadCallback,this);

}



void * HelloWorld::threadCallback(void *)

{

// signal(SIGQUIT,signalCallback);

while(1)

{

signal(SIGQUIT,signalCallback);

sleep(1);

log("run");

}

}



void HelloWorld::signalCallback(int)

{

log("signal call back");

pthread_exit(nullptr);

}



void HelloWorld::menuCallback(Ref * ref)

{

int ret = pthread_kill(thread_id,SIGQUIT);

// int ret = pthread_cancel(thread_id);

if(ret == 0)

log("send success!");

else if(ret == ESRCH)

log("the thread did not exist or already quit");

else if(ret == EINVAL)

log("signal is inval");

}

onEnter函数会被调用的,大家不用关心这个。
...全文
94 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
小塔-皂荚花 2014-09-01
  • 打赏
  • 举报
回复
引用 1 楼 baseball11 的回复:
蛮久以前我也碰到过和你一样的问题,也是用pthread_kill解决了。 感觉一个就是signal还是在循环外调用比较好,再就是使用自定义信号吧,SIGQUIT也许被系统处理了
这次是这么用的,怎么在Android上还是不行,帮忙看下用法正确么?

void HelloWorld::onEnter()
{
    Layer::onEnter();
    pthread_create(&thread_id,nullptr,threadCallback,this);
}

void * HelloWorld::threadCallback(void *)
{
    signal(SIGUSR1,signalCallback);
    struct sigaction act;
    act. sa_handler = signalCallback;
    sigemptyset(&act. sa_mask); //清空此信号集
    act.sa_flags = 0;
    
    sigaction(SIGQUIT, &act, nullptr);
    
//    signal(SIGQUIT,signalCallback);
    
    while(1)
    {
        sleep(1);
        i++;
    }
}

void HelloWorld::signalCallback(int)
{
    log("signal call back");
    pthread_exit(nullptr);
}

void HelloWorld::menuCallback(Ref * ref)
{
    int ret = pthread_kill(thread_id,SIGUSR1);
//    int ret = pthread_cancel(thread_id);
    
    if(ret == 0)
        log("send success!");
    else if(ret == ESRCH)
        log("the thread did not exist or already quit");
    else if(ret == EINVAL)
        log("signal is inval");
}
小塔-皂荚花 2014-09-01
  • 打赏
  • 举报
回复
引用 1 楼 baseball11 的回复:
蛮久以前我也碰到过和你一样的问题,也是用pthread_kill解决了。 感觉一个就是signal还是在循环外调用比较好,再就是使用自定义信号吧,SIGQUIT也许被系统处理了
刚刚在Mac上测试了一下,可以正常的区结束,但是移植到Android上就没什么效果了,我估计真是你说的让系统处理掉了,我用自定义信号试试看。再问一句,你搞Android吗,Android上得处理会吗?
baseball11 2014-09-01
  • 打赏
  • 举报
回复
蛮久以前我也碰到过和你一样的问题,也是用pthread_kill解决了。 感觉一个就是signal还是在循环外调用比较好,再就是使用自定义信号吧,SIGQUIT也许被系统处理了

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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