• Multiple Threads


    About Thread

    1、什么是线程?
    线程时在进程中可以被调度执行的实体
    2、线程与进程之间是什么关系?
    所有线程共享进程的虚拟地址空间和系统资源
    每个进程都至少带一个线程启动

    Thread Stack Size
    1、什么是保留栈空间?
    保留栈空间代表从虚拟内存中分配的总的栈空间大小
    2、什么是初始提交栈空间?和提交页面是什么关系?
    初始提交页面不占用物理内存直到它们被引用,总提交限制的大小是提交页面大小加上占用的物理内存的大小
    3、哪些情况下系统会停止提交页面?
    a.栈空间不足,剩余的栈空间到达保留内存减去一个保护页(防止栈溢出)的大小
    b.系统无法分配更多物理内存
    4、什么情况下线程栈空间会被释放?什么情况下不会释放?
    a.线程正常退出时,线程栈空间会被释放
    b.线程被其他线程终止时,线程栈空间不会释放
    5、如何修改保留栈空间和首次提交栈空间的大小?
    保留栈大小通过链接器选项更改,在可执行文件的标头中体现
    首次提交栈大小通过.def文件更改
    保留栈空间大小永远不会小于首次提交栈空间的大小

    Thread Handles and Identifiers
    创建线程时会返回线程句柄和线程ID
    1、线程句柄的生命周期?线程ID的生命周期?
    线程句柄有效直到关闭句柄,线程释放不影响线程句柄的有效性
    线程ID有效直到线程退出
    2、线程ID如何索引到相应的线程句柄?
    OpenThread

    3、线程句柄分为哪两种?什么是线程伪句柄?什么是线程真实句柄?
    伪句柄是指在当前进程有效的私有句柄,不能拷贝或继承给其他进程的线程句柄,当前进程的私有句柄
    通过GetCurrentThread拿到的是伪句柄
    线程真实句柄是指全局线程句柄,可以通过将伪句柄DuplicateHandle拿到真实句柄,真实句柄可以给其他线程使用
    4、如何枚举进程中的所有线程?
    use the Thread32First and Thread32Next functions.

    Suspending Thread Execution
    1、如何手动挂起线程?如何手动恢复线程?如何在创建时挂起线程?如何让线程挂起一定的时间?

    Thread Local Storage

    1、什么是线程本地存储(TLS)?
    线程本地存储就是为线程局部变量申请一个全局索引,其他线程可以通过这个全局索引检索到这份线程独有的数据
    2、这个全局索引如何申请?索引如何关联数据?如何通过索引检索到数据?索引如何销毁?
    通过TlsAlloc申请,申请成功时存储槽会被初始化为0,一般在进程或dll初始化时申请;通过TlsSetValue关联到数据,其他线程可以用全局索引调用TlsGetValue索引到关联的线程数据,通过TlsFree可以销毁索引
    3、Tls索引是否跨进程?
    Tls索引不跨进程边界

    Creating Windows in Threads
    1、在线程中创建窗口有哪些条件需要满足?
    所有线程都可以创建窗口,创建窗口的线程拥有窗口和关联的消息队列,所以必须要创建一个消息队列;
    创建窗口的线程只能使用MsgWaitForMultipleObjects或MsgWaitForMultipleObjectsEx作为等待函数,不能用其他的等待函数。因为其他的等待函数不能处理消息,如果用其他的等待函数,那么线程在等待的时候发消息会导致死锁。

    Terminating a Thread
    1、线程终止的结果是什么?
    a.线程拥有的所有资源被释放
    b.线程函数的返回值被设置
    c.线程对象状态变为signaled
    d.如果终止的是进程的最后一条线程,那么进程也会退出
    2、线程在哪些情况下会终止?
    a.线程函数return
    b.线程函数调用ExitThread
    c.进程的任意线程调用了ExitProcess
    d.任意线程用线程句柄调用了TerminatedThread
    e.任意线程用线程所属的进程句柄调用了TerminatedProcess
    3、线程终止事件如何通知到dll?
    a.如果线程被ExitThread终止,那么每个attach到进程的dll的入口函数都会被调用,并且会设置一个值指示线程从dll detach;
    b.如果线程被ExitProcess终止,那么dll的入口点函数会被调用一次表明进程在detach;
    c.如果线程被TerminatedThread或TerminatedProcess终止,那么dll的入口函数不会被调用,dll不会被通知
    4、TerminateThread和TerminateProcess有什么后果?
    a.线程资源无法正常释放
    b.attach到进程的dll不会收到线程退出的通知
    c.线程初始提交栈空间不会被回收,导致内存泄漏
    5、如何正确的退出线程?
    a.用CreateEvent创建一个事件对象
    b.每个线程通过WaitForSingleObject等待函数监视Event对象的状态
    c.当Event对象signaled的时候正常退出

  • 相关阅读:
    如何使用观测者模式实现监控和推送
    oracle在desc表时,name 和type列不能格式化问题(占位过长)
    [置顶] Vim用正则表达式进行批量修改
    Eclipse扩展点
    写给C语言新手的话
    QQ圈子降级为“应用”后应关注其隐私设置
    win8vs2012创建自带sqlServer数据库出错
    JQuery 选择器
    SINGLETON(单例模式)---(孤独的人)
    C++中的常对象和常对象成员
  • 原文地址:https://www.cnblogs.com/SwiftChocolate/p/14141424.html
Copyright © 2020-2023  润新知