015 线程退出 启动

线程退出 启动 
  ● 当一个进程销毁的时候
    ○ 销毁临时对象
    ○ 释放堆栈
    ○ 将返回值设置为我的退出代码
    ○ 减少进程内核对象的使用次数
  ● 当一个线程销毁的时候
    ○ 销毁临时对象 调用我的们的析构函数
    ○ 释放当前线程里面锁分配堆栈 -> 窗口 -> HOOK
    ○ 将返回值设置为我的退出代码 线程的入口函数的返回值设置为我的退出代码
    ○ 减少进程内核对象的使用次数
  ● ExitThread 立即结束当前线程
  ● TerminateThread 可以结束其他的线程

  ● Exit
    ○ 会将属于当前的线程的栈销毁
    ○ 但是他不会去调用析构函数
    ○ 很容易造成内存泄漏

  ● 线程启动
    ○ 内核对象结构体
      ○ 使用计数
      ○ ExitCode
      ○ Signaled 当前这个对象是否是能接受信号的状态
      ○ CONTEXT 上下文 当前CPU的状态
        ○ 存储了CPU寄存器的状态 IP(指令) SP(栈寄存器)
    ○ 线程去进程当中,申请一块内存,作为我当前线程的栈。
      ○ lParam
      ○ lpStartAddress 线程的入口函数
      ○ 如果是做逆向的恶化上面两个参数标识

时间: 2024-10-21 03:07:48

015 线程退出 启动的相关文章

015 线程创建

线程  ● 进程启动 ○ 进程内核对象 进程空间 ○ 线程 ● 可以通过IDE设置入口函数 ● 自己创建线程 ○ 创建线程函数 CreateThread() ○ 新建线程内核对象(结构体) ● 线程 ○ 分配一块内存空间,作为当前线程的堆栈 ○ 两条在同一进程内线程,都是隔离的 ○ 线程他们是封闭的,每个线程都有自己的一个堆栈 ○ 但是都是属于当前进程内的堆栈 ○ 进程赋予了线程交互的能力 ● 线程创建 1 HANDLE WINAPI CreateThread( 2 _In_opt_ LPSEC

[转载]DllMain中不当操作导致死锁问题的分析--线程退出时产生了死锁

(转载于breaksoftware的csdn博客) 我们回顾下之前举得例子 case DLL_PROCESS_ATTACH: { printf("DLL DllWithoutDisableThreadLibraryCalls_A:\tProcess attach (tid = %d)\n", tid); HANDLE hThread = CreateThread(NULL, 0, ThreadCreateInDllMain, NULL, 0, NULL); WaitForSingleO

线程退出前操作

#include <unistd.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h> void cleanup() { printf("cleanup\n"); } void *test_cancel(void) { pthread_cleanup_push(cleanup,NULL); printf("test_cancel\n"); whil

为何只能在其关联的线程内启动timer?(Qt会检查一致性,否则就不执行)

为何只能在其关联的线程内启动timer? 在QTimer源码分析(以Windows下实现为例) 一文中,我们谈到: QTimer的是通过QObject的timerEvent()实现的,开启和关闭定时器是通过QObject的startTimer()和killTimer完成的. startTimer最终调用对象关联线程的eventDispatcher来注册定时器: int QObject::startTimer(int interval) { Q_D(QObject); return d->thre

1、线程的启动

我们要启动一个线程,就是调用一个线程实例的start方法.让我们来看看start方法的源码: 1 public synchronized void start() { 2 3 //0值就表示这个线程是新启动的 4 if(threadStatus!=0) { 5 throw new IllegalThreadStateException(); 6 } 7 8 //通知线程群,这个线程已经启动,线程群的"没有启动的数量"属性将减一. 9 group.add(this); 10 11 boo

线程的启动(转)

目录 C#多线程编程(1):线程的启动 1.不带参数的启动方式 2.带参数的启动方法 3.以类的实例作为参数 4.把Thread要处理的业务代码放在一个单独的类中 C#多线程编程(1):线程的启动 在实例化Thread的实例,需要提供一个委托,在实例化这个委托时所用到的参数是线程将来启动时要运行的方法. 在.net中提供了两种启动线程的方式,一种是不带参数的启动方式,另一种是带参数的启动的方式. 1.不带参数的启动方式 如果启动参数时无需其它额外的信息,可以使用ThreadStart来实例化Th

C#多线程 线程的启动

在实例化Thread的实例,需要提供一个委托,在实例化这个委托时所用到的参数是线程将来启动时要运行的方法.在.net中提供了两种启动线程的方式,一种是不带参数的启动方式,另一种是带参数的启动的方式. 不带参数的启动方式 如果启动参数时无需其它额外的信息,可以使用ThreadStart来实例化Thread,如下面的代码: 1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.T

Python的并发并行[4] -&gt; 并发 -&gt; 利用线程池启动线程

利用线程池启动线程 submit与map启动线程 利用两种方式分别启动线程,同时利用with上下文管理来对线程池进行控制 1 from concurrent.futures import ThreadPoolExecutor as tpe 2 from concurrent.futures import ProcessPoolExecutor as ppe 3 from time import ctime, sleep 4 from random import randint 5 6 def f

线程的启动和停止

import java.lang.Thread;import java.lang.Runnable;import java.util.Date; public class DefineAndStartThread{ class ThreadA extends Thread{ private Date runDate; //继承Thread的子类必须实现run方法,Thread中的run方法未做任何事 public void run(){ System.out.println("ThreadA b