免费注册 查看新帖 |

Chinaunix

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

『欢迎讨论』LINUX线程挂起实现。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-03-05 11:39 |只看该作者 |倒序浏览
问题:LINUX中实现线程挂起,与重新启动
方法解决(本人):
a.使用互斥锁

...

小弟先抛砖。。等待中。。。

论坛徽章:
0
2 [报告]
发表于 2004-03-05 12:14 |只看该作者

『欢迎讨论』LINUX线程挂起实现。。

能否说明白点呢?
挂起后从新启动?那是不是要先退出此线程?
不知道我的理解如何。
下面有几种方法不知道是否你想要的
信号量
管道
消息传递

论坛徽章:
0
3 [报告]
发表于 2004-03-05 12:52 |只看该作者

『欢迎讨论』LINUX线程挂起实现。。

抱歉,我把问题具体描述一下

问题:LINUX中实现一线程类其中提供线程挂起,与重新启动线程方法:
如:
//线程类
class CThread
{
        public:
                CThread();
                virtual ~CThread();
                
        public:
                int ThCreate(void *(*ThreadPro)(void *),void * para=NULL);       //创建线程
                int ThSuspend();   //挂起线程  
                int ThResume();   //重新运行线程  
                int ThDelete();    //摧毁线程  

           private:

                    int ManageEvent() ; //外部过程函数调用操作线程互斥
量代码
           private:

                   pthread_mutex_t mutex;  //互斥量
};

ThSuspend 挂起方法实现时,我采用的互斥量来处理,结果导致在外部创建LINUX线程的过程函数时,如是循环执行过程须在循环开始处也添加操作线程互斥量代码,这给该线程类使用造成不便。

该方法使用例子:
//main.cpp file

CThread *th = new CThread;

void * InRecvProc(void * para)
{
  while(1)
  {             //使用该法的约束,多出的代码
           if(th->;ManageEvent() ==TH_STATE_KILL)
           {
                break;
           }
         printf("Begin InRecvProc thread!!! \n";            
  }
  
                return NULL;       
}

int main(int argc, char* argv[])
{

th->;ThCreate(InRecvProc);

th ->;ThCreate(aa);
     sleep(1);
if(th ->;ThSuspend()==E_OK)
           {
                   printf("th_1 ThSuspend Thread success!!\n";
           }

return 0;
}
从上面的例子可以看出这种方法的使用局限性,失去了类的封装性。
希望大侠们发表高见。。

论坛徽章:
0
4 [报告]
发表于 2004-03-05 13:59 |只看该作者

『欢迎讨论』LINUX线程挂起实现。。

不好意思,由于我只是在学操作系统原理,对于LINUX的线程管理不太了解。
其实,ThSuspend()是不是已经有检查了呢?其实这个条件,是否已经在ThSuspend()函数里面检查了呢?
也可以在创建函数的时候,默认把此线程为挂起状态,然后就循环检查有没有机会进入READY状态。
其中sleep(1); 是什么我还看不懂~呵呵。是不是就是挂起一个线程呢?如果是,也应该是ThSuspend(1)才对吧。



while(1)
{ //使用该法的约束,多出的代码
if(th->;ManageEvent() ==TH_STATE_KILL)
{
break;
}
printf("Begin InRecvProc thread!!! \n";
}

return NULL;
}

论坛徽章:
0
5 [报告]
发表于 2004-03-05 14:26 |只看该作者

『欢迎讨论』LINUX线程挂起实现。。

sleep(1);是系统库函数调用,起到时间延迟作用。

讨论的问题是如何构建一个线程类,而不是单指某一单个的线程!ThSuspend()这个方法是给其它调用者(创建者)线程使用的

论坛徽章:
0
6 [报告]
发表于 2004-03-07 20:32 |只看该作者

『欢迎讨论』LINUX线程挂起实现。。

欢迎高手讨论!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP