免费注册 查看新帖 |

Chinaunix

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

请教下怎样把进程中的某一个线程给停住【NPTL库】 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-02 15:47 |只看该作者 |倒序浏览
我通过pthread_create创建了一个线程,然后想让这个线程停住。

由于使用的是NPTL库,所以想到了tkill系统调用。但是现在通过tkill发送一个SIGSTOP信号给线程之后,整个线程组中的所有线程都停下来了。
请问一下怎样才可以使进程中的某一个线程停住啊?(听别人说tkill系统调用可以,可我怎么试都不行呢?)

谢谢先。

附我的测试代码:

A:多线程程序:

  1. static void test_task_print()
  2. {
  3.         while(1) {
  4.                 printf("Task  is executingn" );
  5.                 sleep(5);
  6.         }
  7. }



  8. int main(int argc, char *argv[])
  9. {
  10.         int tid;
  11.         pthread_t t;


  12.         pthread_create(&t, NULL, test_task_print, NULL);

  13.         while(1) {
  14.                 sleep(250);
  15.         }

  16.         return 0;
  17. }
复制代码



B:信号发送程序

  1. int main(int argc, char *argv[])
  2. {
  3.         int tid;

  4.         if (argc != 2) {
  5.                 printf("usage: ./kill_send sig\n");
  6.                 return -1;
  7.         }

  8.         tid = atoi(argv[1]);

  9.         syscall(__NR_tkill, tid, SIGSTOP);
  10.         printf("send signal to thread %d\n", tid);

  11.         return 0;
  12. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2009-04-02 16:22 |只看该作者
用mutex可以解决

论坛徽章:
0
3 [报告]
发表于 2009-04-02 17:08 |只看该作者
哦,谢谢先。

请问下通过mutex怎么做啊,可不可以简单说下思路。

论坛徽章:
0
4 [报告]
发表于 2009-04-02 17:32 |只看该作者
可以使用pthread_kill 实现你需要的,不过楼上说mutex,请问怎么做?

论坛徽章:
0
5 [报告]
发表于 2009-04-02 19:37 |只看该作者
对于NPTL库,实验时发现通过pthread_kil发送SIGSTOP信号l会把所有线程都停住。查了下资料,说NPTL处理信号是进程相关的,所以会停住。在linux thread库中pthread_kill可以工作。

论坛徽章:
0
6 [报告]
发表于 2009-04-02 19:46 |只看该作者
原帖由 richardhesidu 于 2009-4-2 16:22 发表
用mutex可以解决


不知道是不是指的挂起任务的时候获取一个信号量,然后来把线程挂起?

如果这样的话,挂起当前线程应该是可以的,但是如果要挂起其他线程好像不行?

[ 本帖最后由 wiseker 于 2009-4-2 19:52 编辑 ]

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
7 [报告]
发表于 2009-04-03 09:14 |只看该作者

回复 #1 wiseker 的帖子

我没看到你怎么获取这个创建的thread的id的,线程机制里面是可以给thread发信号的,但如果你给进程发信号,会直接干掉这个线程组的

论坛徽章:
0
8 [报告]
发表于 2009-04-03 09:47 |只看该作者
我觉得可以利用条件变量啊, 只要你不broadcast ,那么这个线程不就一直是停止的?

论坛徽章:
0
9 [报告]
发表于 2009-04-03 09:57 |只看该作者
原帖由 dreamice 于 2009-4-3 09:14 发表
我没看到你怎么获取这个创建的thread的id的,线程机制里面是可以给thread发信号的,但如果你给进程发信号,会直接干掉这个线程组的


threadid是作为参数输入的。我是通过proc文件系统获取的这个ID。发送信号的时候,ID不是group ID。

由于linux中ID是每次递增一的,所以也可以猜测出来。

论坛徽章:
0
10 [报告]
发表于 2009-04-03 09:59 |只看该作者
原帖由 star316 于 2009-4-3 09:47 发表
我觉得可以利用条件变量啊, 只要你不broadcast ,那么这个线程不就一直是停止的?


请问一下可不可以简单说下呢?

通过条件变量,我只知道suspend当前线程,但是如果要suspend另外线程怎么做呢?比如有两个线程t1和t2,他们位于相同的线程组,怎么让t1 suspend t2呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP