免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9077 | 回复: 10
打印 上一主题 下一主题

[C] 请教如何用pthread库实现线程的启动和暂停? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-20 13:55 |只看该作者 |倒序浏览
我在linux上,想用pthread库实现这样的功能:我有2个线程:一个主线程,一个工作线程,在主线程中创建工作线程。工作线程不总是工作,也就是说,创建的时候处于暂停状态或休眠状态(不占cpu),当主线程通知它工作的时候就开始工作。开始工作之后,当主线程需要暂停它的时候可以通知它使它暂停。然后工作线程又处于暂停状态(不占cpu)。之后类似,主线程可以随时通知工作线程开始工作,随时暂停工作线程。
我开始的想法是这样的:

pthread_t thread;
int enable = 0;   
void* threadFunc(void* args)  //工作线程函数
{   
      while(1)   
     {      
           if(enable)      
          {           
                work();      
          }      
         else      
         {            
               sleep(1);      
          }   
     }   
     return ((void*)0);
}   

int main()
{      
         pthread_create(&thread, NULL, threadFunc, NULL);     
         enable = 1;      
         sleep(3);     
         enable = 0;      
         ...
}

但感觉用sleep不太好,因为sleep的时间其实不好定。太长太短都不好。其实主线程什么时候启动什么时候暂停工作线程,都是确定的。主线程其实是响应用户的请求,用户说开始work就应该马上work,用户说停止就应该马上停止。
后来我想用条件变量,在工作线程中:

pthread_mutex_lock(&mutex));
pthread_cond_wait(&cond,&mutex);

在主线程中:

pthread_cond_signal(&cond);


但是这样只能启动,无法暂停?

不知道各位大侠有没有什么办法?代码应该如何写呢?
多谢了!




论坛徽章:
0
2 [报告]
发表于 2012-12-20 13:58 |只看该作者
本帖最后由 FaintKnowledge 于 2012-12-20 13:59 编辑

回复 1# testpwd


我觉得你可以先用sigwait让线程阻塞,到时间后把阻塞的信号清除,或者用pthread_kill给它个SIGSTOP信号,然后到时间再给它个SIGCONT信号就可以了吧


附加:
还可以使用pause()和alarm组和

论坛徽章:
0
3 [报告]
发表于 2012-12-20 14:14 |只看该作者
回复 2# FaintKnowledge


    不能确保signal被哪个线程捕获吧?

论坛徽章:
0
4 [报告]
发表于 2012-12-20 14:21 |只看该作者
回复 3# lrita


嗯,是发送到任意一个...

论坛徽章:
0
5 [报告]
发表于 2012-12-20 14:23 |只看该作者
本帖最后由 FaintKnowledge 于 2012-12-20 14:24 编辑

回复 3# lrita


调用pthread_kill之前先获取其线程ID

pthread_kill(pthread_self(),SIGSTOP)

论坛徽章:
0
6 [报告]
发表于 2012-12-20 14:25 |只看该作者
用什么信号量 cond什么的 不是更方便么

论坛徽章:
0
7 [报告]
发表于 2012-12-20 17:16 |只看该作者
多谢各位!希望能看到更多办法!

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
8 [报告]
发表于 2012-12-20 23:09 |只看该作者
0是运行,1是暂停,就可以了.

论坛徽章:
0
9 [报告]
发表于 2012-12-21 14:24 |只看该作者
多谢!请问只在主线程中修改,子线程只是读取这个bool变量,访问这个变量是否需要加锁呢?

论坛徽章:
0
10 [报告]
发表于 2012-12-21 14:52 |只看该作者
回复 9# testpwd


    就本例而言 没必要加锁
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP