线程频繁创建和删除,线程会死掉?

shongbee2 2012-07-05 04:15:57
我写了一个程序,程序的基本需求是
在主线程每个一段时间会出发一个任务,我把这个任务派发给10个线程来处理,然后主线程等待线程处理结束之后再做其他事情。

然后我是这样实现的,
接到任务之后,就会去创建10个线程,然后通过信号量等给他们提供任务信号。等待他们处理之后就强制关闭这10个线程。

开始觉得挺好,后来发现,运行几次任务之后,新创建的线程不会再执行了,而且也不会去等待信号量,然后处理任务,而我的主线程需要去等待他们做完任务的结果。。这样导致所有线程都停止了。。。

我开始以为是死锁。。经过反复的查代码,log,检测工具检测结果之后,确认就是线程没有再执行我的任务导致的。
请问这个是什么原理会出现这种情况?

...全文
784 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
shongbee2 2012-07-06
  • 打赏
  • 举报
回复
谢谢各位,解决方案我已经知道了,我主要是好奇这种现象。。。
结贴了。。谢谢啦。。
zhangxuyu1118 2012-07-06
  • 打赏
  • 举报
回复
发错链接了,SORRY。正确的参考:http://download.csdn.net/detail/zhangxuyu1118/259611
zhangxuyu1118 2012-07-06
  • 打赏
  • 举报
回复
是windows平台吗?
参考:http://download.csdn.net/detail/zhangxuyu1118/260015
“。。。强制关闭这10个线程。。。”是不太好的,你可以考虑让线程自然死亡啊(线程执行函数运行完成即可)。因为线程强制销时毁释放做得不好系统有开销的。

你这个设计不是很合理,可否考虑这样设计呢,一到3个任务线程,永不释放,工作时信号灯举起,工作完成时信号灯灭,SLEEP(1000)。派发任务时往临界区丢任务即可。
beckhanyan 2012-07-05
  • 打赏
  • 举报
回复
这些线程有没有共享的变量?这很关键
drenix 2012-07-05
  • 打赏
  • 举报
回复
干嘛要关闭呢...处理之后reset信号,然后继续等待啊
赵4老师 2012-07-05
  • 打赏
  • 举报
回复
特供多线程调试用:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef WIN32
#include <windows.h>
#include <io.h>
#else
#include <unistd.h>
#include <sys/time.h>
#include <pthread.h>
#define CRITICAL_SECTION pthread_mutex_t
#define _vsnprintf vsnprintf
#endif
//Log{
#define MAXLOGSIZE 20000000
#define ARRSIZE(x) (sizeof(x)/sizeof(x[0]))
#include <time.h>
#include <sys/timeb.h>
#include <stdarg.h>
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
char logstr[16000];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_log;
FILE *flog;
#ifdef WIN32
void Lock(CRITICAL_SECTION *l) {
EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
LeaveCriticalSection(l);
}
#else
void Lock(CRITICAL_SECTION *l) {
pthread_mutex_lock(l);
}
void Unlock(CRITICAL_SECTION *l) {
pthread_mutex_unlock(l);
}
#endif
void LogV(const char *pszFmt,va_list argp) {
struct tm *now;
struct timeb tb;

if (NULL==pszFmt||0==pszFmt[0]) return;
if (-1==_vsnprintf(logstr,ARRSIZE(logstr),pszFmt,argp)) logstr[ARRSIZE(logstr)-1]=0;
ftime(&tb);
now=localtime(&tb.time);
sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
sprintf(timestr,"%02d:%02d:%02d",now->tm_hour ,now->tm_min ,now->tm_sec );
sprintf(mss,"%03d",tb.millitm);
printf("%s %s.%s %s",datestr,timestr,mss,logstr);
flog=fopen(logfilename1,"a");
if (NULL!=flog) {
fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);
if (ftell(flog)>MAXLOGSIZE) {
fclose(flog);
if (rename(logfilename1,logfilename2)) {
remove(logfilename2);
rename(logfilename1,logfilename2);
}
flog=fopen(logfilename1,"a");
if (NULL==flog) return;
}
fclose(flog);
}
}
void Log(const char *pszFmt,...) {
va_list argp;

Lock(&cs_log);
va_start(argp,pszFmt);
LogV(pszFmt,argp);
va_end(argp);
Unlock(&cs_log);
}
//Log}
int main(int argc,char * argv[]) {
int i;
#ifdef WIN32
InitializeCriticalSection(&cs_log);
#else
pthread_mutex_init(&cs_log,NULL);
#endif
for (i=0;i<10000;i++) {
Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);
}
#ifdef WIN32
DeleteCriticalSection(&cs_log);
#else
pthread_mutex_destroy(&cs_log);
#endif
return 0;
}
大尾巴猫 2012-07-05
  • 打赏
  • 举报
回复
反复强制关闭线程,会造成资源泄露吧。
shongbee2 2012-07-05
  • 打赏
  • 举报
回复
谢谢各位大大。。
确定以及肯定是那个线程被挂起导致的,而且一直挂起。
我主要是想问一下大家是否遇到过类似的情况,
不知道具体什么原因会被挂起,我写的代码已经确定了,绝对没有死锁,死循环等情况,(我已经把逻辑和锁都全部去掉了。)

解决办法我已经知道并解决了,就是不那么频繁的创建和删除线程就可以了。。
具体的内部原理还不清楚。。。
恨天低 2012-07-05
  • 打赏
  • 举报
回复
还是自己多思考代码,多加点log来定位问题吧。
qq120848369 2012-07-05
  • 打赏
  • 举报
回复
还有,任务分发到线程是采取什么数据结构? 加锁了吗?
qq120848369 2012-07-05
  • 打赏
  • 举报
回复
看看线程里的逻辑是否有死循环或者逻辑错误挂起了.
从零开始讲述Java多线程的核心知识,通过板书和一步一步画图的方式,引领大家逐步去理解和掌握这些知识;并深入分析源码实现,理解背后的实现原理,知其然还要知其所以然。从多线程核心基础讲起,理解线程的风险,多种创建线程的方式;再到深入理解线程的状态;然后是线程的基本操作。系统、深入、快速上手实现多线程。 课程目标:    快速上手掌握Java多线程的经典课程,    系统、全面、深入掌握Java多线程的核心知识主讲老师:CC老师     20年Java开发和使用经验,多年的首席架构师和CTO,畅销原创书籍《研磨设计模式》的作者。         参与和领导了上百个大中型项目的设计和开发,在互联网应用系统架构、系统设计、    应用级框架和中间件开发等方面具有很多经验和领悟。    更为难得的是,入行20年,仍然奋战在技术一线,深知一线架构师需要掌握哪些技术、    掌握到什么程度、一线架构设计遇到哪些坑、如何才能做出最合适的架构设计,经验最难得!适应人群:    想要系统、深入学习Java多线程    已有Java开发基础,想要快速掌握Java多线程    补充Java多线程知识,为进入一线大厂做准备学习方式:随到随学课程内容:第一节课:系统理解Java并发编程的知识体系    1:为什么要掌握Java并发编程    2:整个课程的目标    3:整个课程的学习内容第二节课:线程必备基础知识    1:理解线程是什么,理解进程,图示    2:理解轻量级的含义    3:理解时序调度,线程是时序调度的基本单元,图示    4:理解调度方式:抢占式,图示    5:理解我们写的程序基本都是多线程的应用,图示    6:理解并发和并行,图示    7:为什么需要线程第三节课:线程的风险    1:线程安全性问题,图示    2:线程的活跃度问题:锁、饥饿、活锁,图示    3:线程的性能问题,这里主要是线程间切换 上下文的开销第四节课:创建线程的方式之一    1: 代码演示:实现Runnable接口的方式来创建线程    2:学习Thread类的方法和属性的应用    3:学习Thread类的源码第五节课:创建线程的方式之二    1:继承Thread的方式来创建线程    2:继续学习Thread类的源码,分析线程初始化过程    3: 代码演示:演示ThreadGroup    4: 代码演示:演示daemon线程,理解daemon线程和主线程的关系第六节课:创建线程的方式之三    1: 代码演示:匿名内部类的方式来创建线程    2:继续学习Thread类的源码,分析run方法的调用过程    3:代码演示:callable的方式来创建线程,带返回值    4: 学习FutureTask的部分源码,分析run方法到call方法的调用过程第七节课:线程状态详解    1:通过Thread源码来查看线程状态的定义    2:一步一步画图,讲述状态之间的变迁第八节课:线程的基本操作sleep 和yield    1:阅读Thread源码    2:代码演示:sleep的使用    3:代码演示:yield的使用    4:sleep和yield的对比理解第九节课:线程的基本操作join和interrupt    1:阅读Thread源码    2:代码演示:join的使用    3:代码演示:interrupt的使用这里是《Java并发编程与源码分析》的第一部分——讲述多线程核心基础实现快速上手多线程的经典之作   

64,652

社区成员

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

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