多线程不安全的posix函数

来源:互联网 发布:淘宝店铺代运营方案 编辑:程序博客网 时间:2024/04/26 04:50
  1. localtime

    localtime返回一个指向静态变量的指针,这样是线程不安全的,使用localtime_r代替

  2. STL中的容器类

    STL容器只保证线程读安全,不保证线程写安全

  3. strtok

    应用函数初次调用strtok时传递一个字串的地址,比如”aaa.bbb.dddd”,并将字串的地址保存在自己的静态变量中,当你将来再次调用strtok并传递NULL时(strtok的特殊用法,第二次调用时字串传NULL表示对第一次传进去的字串继续分隔,所以要先保存字串地址,这是有点怪异的实现),该函数就会引用保存好的字串地址。在多线程环境下,另一个线程也可能调用strtok,在这种环境下,另一个线程会在第一个线程不知道的情况下替换静态变量中的字串地址,这就会导致各种难以排除的错误出现。

  4. asctime()

  5. basename()

  6. catgets()

  7. crypt()

  8. ctermid()//if passed a non-NULL argument

  9. ctime()

  10. dbm_clearerr()

  11. dbm_close()

  12. dbm_delete()

  13. dbm_error()

  14. dbm_fetch()

  15. dbm_firstkey()

  16. dbm_nextkey()

  17. dbm_open()

  18. dbm_store()

  19. dirname()

  20. dlerror()

  21. drand48()

  22. ecvt()//[POSIX.1-2001 only (function removed in POSIX.1-2008)]

  23. encrypt()

  24. endgrent()

  25. endpwent()

  26. endutxent()

  27. fcvt()//[POSIX.1-2001 only (function removed in POSIX.1-2008)]

  28. ftw()

  29. gcvt()//[POSIX.1-2001 only (function removed in POSIX.1-2008)]

  30. getc_unlocked()

  31. getchar_unlocked()

  32. getdate()

  33. getenv()

    genevn的实现原理为:

    进程应当维护着一个全局变量 char **environ,用来指向每一条环境变量的字符串,同时在原本的getenv的实现里,还应当维护着一个全局的字符串的缓冲区(暂且命名为envbuf),当线程调用getenv()时,系统找到对应的环境变量的字符串,拷贝到全局缓冲区envbuf中,再通过getenv()函数返回给调用者。

    如果多个线程同时调用getenv()的话,可能就会出现对envbuf的异步访问,造成返回错误结果

  34. getgrent()

  35. getgrgid()

  36. getgrnam()

  37. gethostbyaddr()//[POSIX.1-2001 only (function removed in POSIX.1-2008)]

  38. gethostbyname()//[POSIX.1-2001 only (function removed in POSIX.1-2008)]

  39. gethostent()

  40. getlogin()

  41. getnetbyaddr()

  42. getnetbyname()

  43. getnetent()

  44. getopt()

  45. getprotobyname()

  46. getprotobynumber()

  47. getprotoent()

  48. getpwent()

  49. getpwnam()

  50. getpwuid()

  51. getservbyname()

  52. getservbyport()

  53. getservent()

  54. getutxent()

  55. getutxid()

  56. getutxline()

  57. gmtime()

  58. hcreate()

  59. hdestroy()

  60. hsearch()

  61. inet_ntoa()

  62. l64a()

  63. lgamma()

  64. lgammaf()

  65. lgammal()

  66. localeconv()

  67. localtime()

  68. lrand48()

  69. mrand48()

  70. nftw()

  71. nl_langinfo()

  72. ptsname()

  73. putc_unlocked()

  74. putchar_unlocked()

  75. putenv()

  76. pututxline()

  77. rand()

  78. readdir()

  79. setenv()

  80. setgrent()

  81. setkey()

  82. setpwent()

  83. setutxent()

  84. strerror()

  85. strsignal()//[Added in POSIX.1-2008]

  86. system()//[Added in POSIX.1-2008]

    system()中会调用fork()产生一个子进程,注意是进程;程序中所有的线程好像都被复制。。
    这样,貌似不能在多线程环境中使用system()

     

  87. tmpnam()//if passed a non-NULL argument

  88. ttyname()

  89. unsetenv()

  90. wcrtomb()//if its final argument is NULL

  91. wcsrtombs()//if its final argument is NULL

  92. wcstombs()

  93. wctomb()

  94. 参考文档:http://www.ccvita.com/506.html

  95. 结论:没什么事别用多线程,一不留神,死都不知道怎么死的..

0 0
原创粉丝点击