C++ 怎样回收线程,。。。 5C

我想实现一个线程池。想到这样一个问题,一个线程被创建以后自动运行,运行结束后自动释放。
比如下面代码中的t运行结束后就释放掉了。那么怎样实现对一个线程的二次使用呢,就比如下面的t运行一次后不要自动释放,重新回收后可以为我执行别的任务。

void fun()
{
cout<<"thread"<<endl ;
}

void main()
{
thread t(fun) ;
t.detach() ;
//t.join();
return ;
}

0

8个回答

真正的线程池不会反复的创建,结束线程。
为了资源的重复利用,反复创建线程也会需要消耗系统资源的, 线程池一般是一开始就预留的创建几个线程。比如4个。然后会有一些任务队列,当你需要进行任务处理的时候,就把任务push到这个队列。线程池中的线程就会像消费者一样,从队列中pop出任务来进行处理,当队列中没有任务的时候,线程池的线程就阻塞等待等。因而线程池中一般会有condition_variable+信号量等方式来进行同步

1
qq_33707711
Mr-Luer 赋值粘贴可耻!
一年多之前 回复
0
Hei_po2
Hei_po2 正的线程池不会反复的创建,结束线程。 为了资源的重复利用,反复创建线程也会需要消耗系统资源的, 线程池一般是一开始就预留的创建几个线程。比如4个。然后会有一些任务队列,当你需要进行任务处理的时候,就把任务push到这个队列。线程池中的线程就会像消费者一样,从队列中pop出任务来进行处理,当队列中没有任务的时候,线程池的线程就阻塞等待等。因而线程池中一般会有condition_variable+信号量等方式来进行同步
一年多之前 回复
qq_33707711
Mr-Luer 这些我看过,过于冗长而且也没说明白我想知道的,而且有些是linux下的。
一年多之前 回复

真正的线程池不会反复的创建,结束线程。
为了资源的重复利用,反复创建线程也会需要消耗系统资源的, 线程池一般是一开始就预留的创建几个线程。比如4个。然后会有一些任务队列,当你需要进行任务处理的时候,就把任务push到这个队列。线程池中的线程就会像消费者一样,从队列中pop出任务来进行处理,当队列中没有任务的时候,线程池的线程就阻塞等待等。因而线程池中一般会有condition_variable+信号量等方式来进行同步

0

可以通过异步消息机制,在子线程建立消息环进行“顺序”处理(这需要根据你的实际业务需求来决定)或者每次开启单独的子线程;如果你描述的是偶尔发生的情况,那么怎么处理都是可以的(只要不是同步线程),如果情况是频繁发生甚至一直这样,那么你应该调整你的业务逻辑。

0

你这种用法是无法回收的。

0

线程退出后就释放,若再使用就有问题了。一般线程池中线程创建后就一直存在不退出的,如楼上所说当前任务执行完后,如果没有任务则线程进入阻塞状态直到新的任务到来。

0

先前写的一片文章,希望对你有帮助
http://blog.csdn.net/qq_30145355/article/details/78481583

0

不要释放它即可,完成任务以后,进入Wait状态即可,用事件或者其它内核对象~

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
pthread线程创建与回收
线程   进程是系统内部承担资源分配的基本单位,线程是系统内部调度的基本单位。进程强调资源独立,线程强调资源共享(线程栈独立)。线程的粒度更细相比于进程,所以多线程程序并发度更高,但更难于去管理 线程创建 int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(vo...
linux c语言 线程资源释放
最近做了多线程并发网络编程的时候出现了一个问题。程序在运行的过程中,占用的内存会越来越大。起初我怀疑是程序有指针没有被free,导致内存泄漏。后来通过调试才发现, 原来是线程结束之后, 线程的资源没有得到释放。 Linux系统中程序的线程资源是有限的,表现为对于一个程序其能同时运行的线程数是有限的。而默认的条件下,一个线程结束后,其对应的资源不会被释放,于是,如果在一个程序中,反复建立线程,而线
CC++应用篇(004) 01_4线程的停止与回收
1、线程的停止 线程的停止:当return语句被执行时,表示该线程正常退出。 int Routine() { printf(&quot;do something \n&quot;); return 0; // 线程的主函数退出 } return语句被执行、Routine()返回、线程退出 实例中如果没有getchar()则在main()函数中,执行后直接退出,即主线程退出,则我们创建的线程没...
线程的停止与回收
A01-04  线程的停止和回收 线程停止:当return语句被执行时,表示线程正常退出。 int Routine() { printf("do something\n"); return 0; //线程的主函数退出 } return语句被执行,Routune()返回,线程退出 异常退出: ①当主线程退出的时候,所
C语言 线程创建与销毁基础接口(Windows & Linux)
Linux篇 创建线程: int pthread_create( pthread_t *tidp, //线程ID const pthread_attr_t *attr, //线程属性 (void*)(*start_rtn)(void*), //线程函数 void *arg);//传递给线程的参数 返回值: 成功-返回0 失败-返回错误码 线程属性 线...
线程的创建,回收,取消
线程创建  int pthread_create(pthread_t *th, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);    参数一:输出型参数,相当于线程号,指向线程标识符的指针    参数二:用来设置线程属性    参数三:输入型参数,线程运行函数的地址    参数四:运行函...
ThreadPoolExecutor 工作线程调度和回收
        ThreadPoolExecutor对任务的提交和异步执行已分析完毕,现在要补充一些关于它对线程池的管理,也就是对其工作线程的调度和回收.        还记得上一篇“ThreadPoolExecutor execute 方法分析”最后一个关于任务异步执行的流程图,虽然分支庞杂,但只有两个条逻辑路径会增加工作线程加入到线程池:一是当前线程池的大小&amp;lt;核心线程池大小(即...
JVM 线程无法回收排查 -- 实例
问题排查步骤: 1. jstack查看jvm线程信息,发现已经有1w+线程存在 2. 看命名规范:pool-11238-thread-1大量存在,且处于waiting状态,由此可以猜测代码中存在一种ThreadPoolExecutor调用,coresize设置为1的地方每次调用完没有回收 3. 登录服务器,jmap -dump 文件,下载至本地 4. 使用jvisualvm工具查看dump...
避免僵尸线程:线程资源的回收与join、detach
#include &amp;lt;pthread.h&amp;gt;#include &amp;lt;stdio.h&amp;gt;void* __task(void*arg){ return (void*)0;}int main(int agrc, char**argv){ int i = 0; pthread_t pid = 0; int ret = 0; pthread_attr_t attr; for(i=0; i&amp;lt...
ThreadPoolExecutor线程池如何实现计时回收空闲线程
疑惑 说到线程池,其实已经看过很多遍源码,不过大多是复用和阻塞队列获取时的部分,今天突然想到,线程池有个最大空闲时间,即空闲线程最大存活时间,我想知道怎么实现计时的,难道是每一个worker类中一个计时器吗? 解惑 找了很多博客,都没有找到,只能自己在源码里找了,意外地好找,因为用到keepAliveTime这个变量,整个ThreadPoolExecutor.java中只有一个方法,只看这个方法就...
线程退出与资源回收
线程退出 单个线程可以通过3种方式退出,因此可以在不终止整个进程的情况下,停止它的控制流。 1)线程可以简单地从启动历程中返回,返回值是线程的退出码。 2)线程可以被统一进程中的其他线程所取消。 3)线程调用pthread_exit。 #include &amp;amp;lt;pthread.h&amp;amp;gt; void pthread_exit(void *rval_ptr); rval_ptr参数是一...
【C语言】【unix c】进程资源的回收
【C语言】【unix c】进程资源的回收
java线程池线程回收
注意: 一定要将线程回收,否则程序会一直等待!! 也可以关闭线程池,来退出程序,但是这样会导致新的任务无法执行!! 线程回收之后,有新的任务到来就会自动新建线程。 class Task implements Runnable { private int x; //线程编号 public Task(int x) { this.x = x;
线程池中的空余线程是如何被回收的
首先要知道在线程池中空余线程被回收的条件:当线程池中的线程数量大于 corePoolSize 的时候,如果这时没有新的任务提交,核心线程外的线程不会立即销毁,而是会等待,直到等待的时间超过 keepAliveTime。 文章地址: https://mp.weixin.qq.com/s?__biz=MzU1OTgyMDc3Mg==&amp;mid=2247483834&amp;idx=1&amp;s...
android启动线程后需要手动释放,系统不回收的线程
1. ThreadPool:必须主动销毁,不然所有线程均还存在; 2. HandlerThread:如果是自己new出来的, 必须主动销毁,不然线程均还存在; 3. GlSurfaceView: 必须主动调用release,不然线程会存在 不会有线程泄露的有: 1. new Thread():如果内部没有while死循环, 已经结束的; 不用主动回收;...
System.gc与finalize以及Thread对象何时被回收
System.gc()建议JVM进行一次垃圾回收。垃圾对象在被回收之前,其finalize方法会被JVM自动调用,用于做一些清除工作。简单地说,调用了System.gc()之后,java在内存回收过程中就会调用那些要被回收的对象的 finalize() 方法。 下面看一个例子。 User:package com.zzj.gc; public class User { private S
AsyncTask必知必会(二)
AsyncTask必知必会(二)转载请注明出处: http://blog.csdn.net/qinjunni2014/article/details/43958245在上一讲中,我们谈到,Asynctask.ThreadPoolExecutor在调度任务执行的时候,遵从的顺序是 先安排core_pool_size数量的任务以core thread执行, 然后将多余任务入工作队列, 如果队列也满,则将
关于C++11多线程的资源回收问题
关于C++11多线程的资源回收问题,请教各位大神 今天工作时遇到个多线程的问题, 程序启动时,std::Thread 开启了一个线程,线程里有new一些内存块,然后有一个while循环,循环里有一个http的请求数据的操作,每次如果有HTTP请求的话都会暂时阻塞线程5s,但是这个时候我关闭客户端的话,需要通知线程里的while跳出,然后再delete线程一开始分配的内存和线程资源回收,然后在退出程...
Java线程池任务执行完毕后回收线程
Java线程池任务执行完毕后回收线程 线程池中的所有任务执行完毕后,线程并没有停止,导致JVM出现OOM问题。后来查找了下面链接的资料,解决问题。 ref: http://www.cnblogs.com/pengineer/p/5011965.html 问题及现象: public static void main(String[] args) { BlockingQueue queu...
linux线程退出的方式及线程资源清理
关键词:线程资源释放, pthread_join() 1, 每个线程有自己的一组寄存器,自己的栈空间, 自己的errno变量; 2,pthread_create线程创建并不能保证哪个线程先运行,新线程还是调用线程。 3,线程正常退出的方式有三种: 线程函数直接return, 被同一进程中的其他线程调用pthread_cancel取消,线程调用pthread_exit 退出,(线程运行异常退出
预防线程占用资源时间过长,导致资源被意外回收的线程释放在重启
预防线程占用资源时间过长,导致资源被意外回收的线程释放在重启 using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace ThreadRedoTest { class Program { ...
netty5.0的任务线程无法回收的问题
在最近的项目的运用了netty5.0,之后就发现过两天tomcat就莫名的内存消耗增大,或者直接就进程死掉了。 跟踪了很久发现是netty5在任务线程组里面很多的没有进行回收,然后又创建了很多新的任务线程。但也不是一次性就创建了很多,慢慢的增加的。 通过VisualVM追踪发现很多的nioEventLoopGroup线程,而且很明显的使用中线程不会增加,但是闲下来了,慢慢就会增加。非常奇怪,应
【线程】Linux线程的回收-----pthread_join
pthread_join函数负责线程的回收,回收系统分配的资源,主要是线程pcb。pthread_join的功能和waitpid类似。 pthread_join 的函数原型如下: int pthread_join(pthread_t thread, void **retval); 第一个参数是线程的id号 线程退出时使用pthead_exit()函数,返回退出状态。第二个参数获取线程的退出...
嵌入式Linux并发程序设计,线程,线程概念、特点、共享/私有资源,创建线程pthread_create()/回收线程pthread_join()/结束线程pthread_exit()
文章目录1,线程概念2,线程特点3,线程共享资源--私有资源4,Linux线程库--pthread线程库中提供了如下基本操作a,创建线程pthread_create()b,回收线程pthread_join()c,结束线程pthread_exit()5,线程示例 1,线程概念 进程 线程 ·进程有独立的地址空间 ·Li...
Android Activity 销毁后线程会不会被GC回收?
Android Activity 销毁后线程会不会被GC回收?曾想当然地认为页面被finish之后线程会被android 虚拟机的垃圾回收机制回收掉。 于是用页面跳转做测试测试代码public class MainActivity extends Activity { Timer timer = new Timer(); @Override public void onCre
JAVA多线程实现-可回收缓存线程池(newCachedThreadPool)
        在前两篇博客中介绍了单线程化线程池(newSingleThreadExecutor)、可控最大并发数线程池(newFixedThreadPool)。下面介绍的是第三种newCachedThreadPool——可回收缓存线程池。        在JAVA文档中是这样介绍可回收缓存线程池的:创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步...
Activity已销毁,创建的线程未回收问题
今天在做新模块测试时发现了一个严重的问题,当一个activity开启一个线程时,如果当前activity调用finish()函数不会关闭当前创建的线程。对于每个新建activity,如果activity中的线程发生内存泄漏。在Java中线程时垃圾回收机制的根源,也就是说,在运行系统中DVM虚拟机总会使硬件持有运行状态的进程的引用,结果导致处于运行状态的线程将永远不会回收。因此你必须为你的后台线程实
linux 信号 回收子进程
#include #include #include #include #include #include void err(char *name, int err_num) { perror(name); exit(err_num); return ; } void fun(int signo) { int re; int pid
页面回收线程
在kernel中会为每个numa节点建一个内核线程kswapd,主要用于在内存不足时回收页面 static int __init kswapd_init(void) { int nid, ret; swap_setup(); #遍历所有的numa节点,每个numa节点调用kswapd_run for_each_node_state(nid, N_MEMORY) kswapd_run...
c语言如何释放一个被阻塞住的线程
问:在c语言中,使用pthread_create创建线程。在线程中阻塞函数导致其阻塞的时候,如何退出线程?答:线程退出方式:(1)正常顺序执行完后return;(2)在线程内部自身调用pthread_exit();这两种方式都依赖于线程函数自身执行,如果线程遇到阻塞函数被阻塞,则不能继续执行,则无法满足上述条件。(3)使用pthread_cancel()函数:该函数在cancle point处能退...
new Thread() 对象什么时候被回收呢?
在Java中什么样的对象会被回收呢? 通过引用计数判断不存在引用的对象。 通过遍历GC Root来判断不存在引用的对象。 假设有如下一段代码(推荐使用线程池): public void test(){ Thread thread = new Thread(new Runnable() { @Overrid...
网络编程(41)—— Linux线程销毁的两种方法
Linux的线程的创建必然会伴随着内存空间的分配,而当线程函数执行完毕时,线程空间同样也不会被自动收回。特别是,Linux线程的销毁和进程也不一样,即使主函数结束,如果不主动回收,线程空间也不会被释放。类似于永远不能被回收的僵尸进程,我们姑且叫这种线程为僵尸线程吧。本文就是介绍回收这种僵尸线程的资源的两种方法。 方法一:利用pthread_join()函数。         这个函数在
C++11学习笔记-----线程库std::thread
在以前,要想在C++程序中使用线程,需要调用操作系统提供的线程库,比如linux下的。但毕竟是底层的C函数库,没有什么抽象封装可言,仅仅透露着一种简单,暴力美 C++11在语言级别上提供了线程的支持,不考虑性能的情况下可以完全代替操作系统的线程库,而且使用起来非常方便,为开发程序提供了很大的便利 Linux下的原生线程库 pthread库函数 创建线程采用pthread_creat
c语言:主存空间的分配和回收
链表实现:系统采用最优适应分配算法为作业分配主存空间,而且具有紧凑技术。请编程完成以下步骤::#define n 10 /*假定系统允许的最大作业 数量为n,n值为10*/ struct {int number; /*序号*/ int address; /*已分配分区起始地址,单位 为KB */ int length; /*已分配分区长度,单位KB*/ float flag; /*已分配区表登记栏标志, 0:空表项,否则为作业名;*/ }used_table[n]; /*已分配区表*/
Android线程的创建与销毁
ndroid线程的创建与销毁 在Android开发中经常会使用到线程,一想到线程,很多同学就立即使用 new Thread(){...}.start(); 这样的方式。这样如果在一个Activity中多次调用上面的代码,那么将创建多个匿名线程,程序运行的越久可能会越来越慢。因此,需要一个Handler来启动一个线程,以及删除一个线程。 保证线程不会重复的创建。 1、创建Ha...
线程的创建,取消,同步与回收
#include <pthread.h> pthread_mutex_t codvoid* fn(void *arg){ pthread_mutex_lock(&cond);//上锁 ... pthread_mutex_unlock(&cond);//解锁}void main(){ pthread_t pid; pthread_create(&pid, NULL,f
程序退到后台的时候,所有线程被挂起,系统回收所有的socket资源问题及解决方案
工程中使用tcp长连接来和服务端进行数据传输,在IOS平台上,由于苹果的后台机制,会有以下问题:当程序退到后台的时候,所有线程被挂起,系统会回收所有的socket资源,那么socket连接就会被关闭,因此无法再进行数据的传输。当程序退到后台的时候,所有线程被挂起,系统会回收所有的socket资源,那么socket连接就会被关闭,因此无法再进行数据的传输。 实际测试时,开启后台定位的应用,当应用进入
C语言通过线程实现回调机制
//author:foolishflyfox //说明:该程序用于简单演示通过多线程对回调函数的实现异步操作 //由于只是演示作用,故代码相对简陋 //编程过程中的几点注意 //1、通过fork创建的多进程程序,并不共享全局变量 //2、if(fork()==0){子进程执行代码} //3、如果子程序退出后,没有被父程序的wait函数或waitpid函数所回收,而且父程序没有退出,该子程序将成为僵尸
java多线程作业
多线程 一、判断题(T为正确,F为错误),每题1分 1.如果线程死亡,它便不能运行。(T) 2.在Java中,高优先级的可运行线程会抢占低优先级线程。(T) 3.线程可以用yield方法使低优先级的线程运行。(F) 4...程序开发者必须创建一个线程去管理内存的分配。(F) 5.一个线程在调用它的start方法,之前,该线程将一直处于出生期。( T) 6.当调用一个正在进行线程的s
linux下的C语言开发(线程等待)
线程等待