为什么不能用Abort退出线程】的更多相关文章

在使用线程时,如果线程还未结束直接退出线程很有可能会导致数据丢失. class threadAbort { static void Main(string[] args) { WriteMessage("主线程开始工作", ConsoleColor.White, ConsoleColor.White); Thread th = new Thread(new ThreadStart(TestTry)); th.Start(); Thread.Sleep(500);//500毫秒后结束线程…
stop() 存在的问题 使用 stop() 来退出线程是不安全的.它会解除由线程获取的所有锁,可能导致数据不一致. 举个例子: public class StopTest { public static void main(String[] args) throws Exception { Person person = new Person(); person.setNameAndAge("Tom", 10); MyThread thread = new MyThread(pers…
Java线程监听,意外退出线程后自动重启 某日,天朗气清,回公司,未到9点,刷微博,顿觉问题泛滥,惊恐万分! 前一天写了一个微博爬行程序,主要工作原理就是每隔2分钟爬行一次微博,获取某N个关注朋友微博数量,然后将其保存起来,2分钟之后再次爬行,再取 其微博数量,与2分钟前保存的微博数量比较,如果数量增加,说明该好友在此2分钟之内发布微博,如果数量减少,则是删除微博.最后将爬行结果发送到指定手机上,作为通知! 今天看微博时发现自己关注的朋友发布了微博,然而自己手机却没有收到报警消息,查看爬行日志发…
退出线程可以有四种方法: 1.线程函数的return返回(最好这样): 其中用线程函数的return返回, 而终止线程是最安全的, 在线程函数return返回后, 会清理函数内申请的类对象, 即调用这些对象的析构函数. 然后会自动调用 _endthreadex()函数来清理 _beginthreadex(...)函数申请的资源(主要是创建的tiddata对象). 2.调用 _endthreadex()函数 或 ExitThread()函数(最好不要): 如果使用这两种方法退出线程, 则不会执行线…
exe崩溃用windbgattach后有宝贵现场,可看程序退出线程等,千万不要清屏…
QThread实例代表一个线程,我们可以重新实现QThread::run(),要新建一个线程,我们应该先继承QThread并重新实现run()函数. 需要注意的是: 1.必须在创建QThread对象之前创建 QApplication (或QCoreApplication)对象. 2. QCoreApplication::exec() 必须只能从主线程调用,不能从QThread线程调用. class MyThread : public  QThread { Q_OBJECT public: MyT…
.Application.Exit(); //强制所有消息中止,退出所有的窗体,但是若有托管线程(非主线程),也无法干净地退出: .System.Environment.Exit(); //无论在主线程和其它线程,只要执行了这句,都可以把程序结束干净 .this.Close();//只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出: .Application.ExitThread();//强制中止调用线程上的所有消息,同样面临其它线程无法正确退…
Thread.Abort 方法在c#中用作强制中断线程的执行,大多用于线程内部满足某个特定条件而自己调用关闭自身,比如下面的代码在i自增到3的时候就会停止打印. class Program { static void Main(string[] args) { Thread thread = new Thread(ShowMessage); thread.Start(); Console.Read(); } public static void ShowMessage() { ; while (…
1.Abort当前线程,后续程序不会执行 class Program { public static Thread thread1; static void Main(string[] args) { thread1 = new Thread(Method1); thread1.Start(); Console.ReadKey(); } public static void Method1() { try { for (int i = 0; i < 10; i++) { Console.Writ…
今天看CSDN上一个很老的帖子,有个人说Thread.Abort()方法调用之后一定会抛出异常,我对这个有点疑问. 于是自己做了一个测试demo,来研究Abort抛出异常的时机.废话少说,直接上代码: static void Main(string[] args) { Thread th = new Thread(Worker); th.Start(); Thread.Sleep(); try { Console.WriteLine(th.ThreadState+","+th.IsAl…
1. 线程的等待退出 1.1. 等待线程退出 线程从入口点函数自然返回,或者主动调用pthread_exit()函数,都可以让线程正常终止 线程从入口点函数自然返回时,函数返回值可以被其它线程用pthread_join函数获取 pthread_join原型为: #include <pthread.h> int pthread_join(pthread_t th, void **thread_return); 1. 该函数是一个阻塞函数,一直等到参数th指定的线程返回:与多进程中的wait或wa…
在windows下调用_beginthread创建子线程并获得子线程id(函数返回值),如果子线程很快退出,在主线程中调用WaitForSingleObject等待该线程id退出,会导致主线程卡死.需要修改_beginthread为_beginthreadex解决该问题. 那么,_beginthread为何会导致WaitForSingleObject卡死,而_beginthreadex却不会呢?这需要查看两个函数的实现. 历史原因 由于C/C++的历史早于线程的出现,因此C/C++的函数并不都是…
今天分析项目中进程中虚存一直增长问题,运行10个小时虚存涨到121G ,RSS占用为16G 非常恐怖. Valgrind测试无内存泄漏. 内存32G 64bit系统信息如下: Linux线程使用方式是主进程依据请求的多少动态创建和退出线程.通过pmap -x pid查看进程内个部分内存分配情况: 发现大量如下占用: 通过查询可知[anon]为未实际分配的内存,即虚存:通过如下命令计算出一共有11946个,每个对应10M总大小为 119460≍119G cat process_info.txt |…
前言 创建线程: pthread_create() 退出线程: pthread_exit()return pthread_cancel() 线程的创建 使用多线程,首先就需要创建一个新线程.那么线程是如何被创建的呢,是用下面这个函数创建的. #include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *ar…
同事说:  TT***.factary(  procedure()  begin    ....    abort;    ....  end)大家在TTask中不建议用abort因为难以控制,我测试了一下,abort对于try...finally...中的finally的代码是会执行.但代码中,有些不是在finally的,还有abort不会触发Terminate线程要正常的结束,否则容易控制不好,好像我们的系统中没有需要用到abort的业务.  Rogge  9:06:16 调用一般的函数可以…
1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程完成                       锁系统 构成 目的 跨进程? 速度 lock 确保只有一个线程访问某个资源或某段代码. 否 快 Mutex 确保只有一个线程访问某个资源或某段代码.可被用于防止一个程序的多个实例同时运行. 是 中等 Semaphore 确保不超过指定数目的线程访问某…
0 概述 所谓同步,就是给多个线程规定一个执行的顺序(或称为时序),要求某个线程先执行完一段代码后,另一个线程才能开始执行. 第一种情况:多个线程访问同一个变量: 1. 一个线程写,其它线程读:这种情况不存在同步问题,因为只有一个线程在改变内存中的变量,内存中的变量在任意时刻都有一个确定的值: 2. 一个线程读,其它线程写:这种情况会存在同步问题,主要是多个线程在同时写入一个变量的时候,可能会发生一些难以察觉的错误,导致某些线程实际上并没有真正的写入变量: 3. 几个线程写,其它线程读:情况同2…
线程与进程关键字对比 创建新流 fork/pthread_create 退出控制流 exit/pthread_exit 获取退出状态 waitpid/pthread_join 在退出时的清理工作 atexit/pthread_cleanup_push 非正常退出 abort/pthread_cancel 创建线程 int pthread_create(线程ID返回值, 线程属性, 任务地址, 任务附加参数) 获取线程ID: pthread_t pthread_self(void) 判断是否同一线…
基于事件的异步模式 (EAP -- The Event-Based Asynchronous Pattern) EAP提供了一个简单的办法,通过它的类能够提供多线程能力,而不需显式的开启或管理线程.它还提供了以下特性: 取消合作模式 当工作线程完成时,安全更新WPF或WF的能力 转发异常给完成的事件 EAP只是一种模式,因此它的这些特性必须由实现的人来完成.框架中只有少数几个类遵循了这个模式,最明显的是BackgroundWorker和WebClient.这个模式的本质:一个类提供了一系列家族成…
1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程完成                       锁系统 构成 目的 跨进程? 速度 lock 确保只有一个线程访问某个资源或某段代码. 否 快 Mutex 确保只有一个线程访问某个资源或某段代码.可被用于防止一个程序的多个实例同时运行. 是 中等 Semaphore 确保不超过指定数目的线程访问某…
操作系统通过线程对程序的执行进行管理,当操作系统运行一个程序的时候,首先,操作系统将为这个准备运行的程序分配一个进程,以管理这个程序所需要的各种资源.在这些资源之中,会包含一个称为主线程的线程数据结构,用来管理这个程序的执行状态. 在Windows操作系统下,线程的的数据结构包含以下内容: 1.线程的核心对象:主要包含线程当前的寄存器状态,当操作系统调度这个线程开始运行的时候,寄存器的状态将被加载到CPU中,重新构建线程的执行环境,当线程被调度出来的时候,最后的寄存器状态被重新保存到这里,已备下…
线程同步机制:http://www.cnblogs.com/zheng39562/p/4270019.html 一.基础知识 1:基础知识. 1,线程需要的信息有:线程ID,寄存器,栈,调度优先级和策略,信号屏蔽字,errno变量和线程私有数据. 2,进程的所有信息对所有线程都是共享的. 3,是否支持有多线程有以下两种方式测试: 1)编译时确定:#ifdef _POSIX_THREADS 2)运行时确定:sysconf函数调用 _SC_THREADS 常用. 4,线程ID. 1)一个进程中,线程…
什么是线程 说话一:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位. 线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行 说法二:进程和线程都是由操作系统所体会的程序运行…
因为不会c++,今天主要是学习了一下c++的东西,感觉非常麻烦. 目前知道了c++里创建线程createThread,返回一个内核对象(HANDLE),我的理解是,c++中系统层面上的操作(线程,文件等)都是基于HANDLE.这点很奇怪.我拿c#或者java(这两个差不多)来做个比较. c#里创建线程后,所有操作权都在Thread对象上. Thread t = new Thread(()=>{ Thread.Sleep(); Console.WriteLine("线程函数执行完毕"…
今天记录一下异步多线程的进阶历史,以及简单的使用方法 主要还是以Task,Parallel为主,毕竟用的比较多的现在就是这些了,再往前去的,除非是老项目,不然真的应该是挺少了,大概有个概念,就当了解一下进化史了 1:委托异步多线程,所有的异步都是基于委托来实现的 #region 委托异步多线程 { //委托异步多线程 Stopwatch watch = new Stopwatch(); watch.Start(); Console.WriteLine($"开始执行了,{DateTime.Now.…
线程私有数据(Thread-specific data,TSD):存储和查询与某个线程相关数据的一种机制. 在进程内的所有线程都共享相同的地址空间,即意味着任何声明为静态或外部变量,或在进程堆声明的变量,都可以被进程内所有的线程读写. 一个线程真正拥有的唯一私有存储是处理器寄存器,栈在"主人"故意暴露给其他线程时也是共享的. 有时需要提供线程私有数据:可以跨多个函数访问(全局):仅在某个线程有效(私有)(即在线程里面是全局).例如:errno. 进程中的所有线程都可以访问进程的整个地址…
首先我们先增加一个公用方法DoSomethingLong(string name),这个方法下面的举例中都有可能用到 #region Private Method /// <summary> /// 一个比较耗时耗资源的私有方法 /// </summary> /// <param name="name"></param> private void DoSomethingLong(string name) { Console.WriteLi…
操作系统通过线程对程序的执行进行管理,当操作系统运行一个程序的时候,首先,操作系统将为这个准备运行的程序分配一个进程,以管理这个程序所需要的各种资源.在这些资源之中,会包含一个称为主线程的线程数据结构,用来管理这个程序的执行状态. 在Windows操作系统下,线程的的数据结构包含以下内容: 1.线程的核心对象:主要包含线程当前的寄存器状态,当操作系统调度这个线程开始运行的时候,寄存器的状态将被加载到CPU中,重新构建线程的执行环境,当线程被调度出来的时候,最后的寄存器状态被重新保存到这里,已备下…
转自:https://www.cnblogs.com/imapla/p/4234258.html Linux内核的三种调度策略: 1.SCHED_OTHER 分时调度策略 2.SCHED_FIFO  实时调度策略,先到先服务.一旦占用cpu则一直运行.一直运行直到有更高优先级任务到达或自己放弃 3.SCHED_RR实  时调度策略,时间片轮转.当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾.放在队列尾保证了所有具有相同优先级的RR任务的调度公平 Linux线程优先级设置: 首先,可以…
文件的操作:(file与fileinfo,前者是静态方法,执行安全检查,适合对一个的操作) 1.1.create: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using…