• 《Win32多线程程序设计》学习笔记 第8章 使用C Runtime Library


    1. 不要再一个MFC程序中使用_beginthreadex()或者CreateThread().
    2. 如果你写一个多线程程序,而且没有使用MFC,那么你应该总是和多线程版本的C - Runtime library 连接,并且总是以_beginthreadex()和_endthreadex()取代CreateThread()和ExitThread(). _beginthreadex()的参数和CreateThread一样,并且承担适当的C runtime library 初始化工作。
    3.  只要你以_beginthreadex()取代CreateThread(), 你就可以在任何线程中安全的调用任何C runtime函数。
    4.  原先的C runtimelibrary是单线程版本的,没有考虑到多线程的需要,所以在多线程中使用时会引起race condition。多线程版本中,如errno之类的变量,现在变成了每个线程都各拥有一个,多线程中的数据结构都以同步机制加以保护。
    5. 如果以命令行或者从一个external makefile中执行visual c++编译器,你可以根据下列选项决定使用哪个版本的c runtime library
      /ML    Single-Threaded
      /MT    Multithreaded (static)
      /MD    Multithreaded dll
      /MLd   Debug Single-Threaded
      /MTd   Debug  Multithreaded (static)
      /MDd   Debug  Multithreaded dll
    6. 为了保证多线程情况下的安全,runtime library 就必须为每个他启动的线程做一下登记,分别线程专属的内存作为线程的局部变量来使用。因此,_beginThreadex就包装了CreateThread,在其中做额外的登记工作。
      uintptr_t _beginthreadex( 
         
      void *security,   //相当于CreateThread中的security属性,NULL表默认
         unsigned stack_size,  //新线程的堆栈大小,单位字节, 对应的数据类型是DWORD
         unsigned ( *start_address )( void * ),  //线程启动函数
         void *arglist,       //线程的参数,对应win32的LPVOID
         unsigned initflag,   //启动的状态标志,对应win32的DWORD
         unsigned *thrdaddr   //新线程的ID
      );

      返回值:
       线程的HANDLE,必须强制转换成类型为win32的handle后才能使用。如果函数失败,返回0,其原因被设定在errno和doserrno全局变量中。

    7. 绝对不要在一个以_beginthreadex启动的线程中调用ExitThread(),因为这样一来,C runtime library就没有机会释放"为该线程而配置的资源了"。而应该是用_endthreadex()
    8. 下面是一些一般性的规则,如果主线程之外的任何线程进行一下操作, 就应该使用多线程版本的C runtime library,并使用_beginthreadex和_encthreadex
      在C程序中使用malloc和free,或者在c++程序中使用new 和delete
      调用stdio.h或者io.h中声明的任何函数。
      使用浮点变量或者浮点运算函数
      调用任何一个使用了静态缓冲区的runtime函数,如asctime,strtok或者rand().
      如果worker线程没有使用上述那些函数,那么单线程版本的runtime library以及CreateProcess都是安全的。
    9. 避免stdio.h,在许多情况下,舍弃C runtime library并不是困难,因为win32提供了许多关于文件处理,内存管理的函数。唯一担心的是如何在没有stdio.h的情况下进行屏幕输出。wsprintf函数可以代替sprintf。GetStdHandle函数可以获得stdin,stdout和stderr对应的win32句柄。
    10. 除非是多线程版本,否则C runtime library中的内存管理函数在多线程程序中是不安全的。
    11. 避免使用_beginthread().
  • 相关阅读:
    Centos系统安装
    HPDL380G8平台11.2.0.3 RAC实施手册
    bash的位置变量和特殊变量
    bash中的算术运算
    bash文本查看及处理工具
    bash快捷键及输入输出重定向
    bash文件名统配
    文本搜索grep知识点总结
    sed练习
    流编辑器sed知识点总结
  • 原文地址:https://www.cnblogs.com/kwliu/p/2195909.html
Copyright © 2020-2023  润新知