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

小塔-皂荚花 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函数会被调用的,大家不用关心这个。
...全文
133 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也许被系统处理了
内容概要:SSD2828QN4是一款MIPI主桥接芯片,用于连接应用处理器与传统并行LCD接口及支持MIPI从属接口的LCD驱动器。该芯片支持最高每通道1Gbps的串行链路速度,最多可配置4个数据通道,显著减少了信号数量。它支持多种接口模式,包括RGB+SPI组合接口,适用于驱动智能或非智能显示面板,并能通过命令模式和视频模式传输数据。芯片内置时钟和复位模块、外部接口、协议控制单元(PCU)、包处理单元(PPU)、错误校正码/循环冗余校验(ECC/CRC)模块、长包和命令缓冲区、D-PHY控制器、模拟收发器以及内部锁相环(PLL),确保了高效的数据传输和系统稳定性。此外,文档详细描述了芯片的引脚分配、寄存器设置、操作模式、电源序列、时序特性等关键参数,为开发者提供了全面的技术指导。 适合人群:具备一定硬件设计基础,从事嵌入式系统开发、显示技术研究的研发人员。 使用场景及目标:①实现应用处理器与MIPI兼容显示屏之间的高速数据传输;②优化显示系统的功耗表现,减少电磁干扰(EMI);③通过灵活配置不同接口模式来适应各种显示设备的需求。 阅读建议:此文档面向具有一定电子工程背景的专业人士,建议读者结合实际项目需求深入理解各章节内容,特别是关于寄存器配置、时序要求等方面的具体说明。对于初次接触此类技术的开发者而言,建议先熟悉基本概念再逐步掌握高级功能的应用方法。

65,210

社区成员

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

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