内核和上层宣判strtok gameover

 char *strsep(char **stringp, const char *delim);

  char *strtok(char *s, const char *delim);strtok是线程不安全的函数

    strtok不是一个线程安全的函数,多线程下应该用strtrok_r;原型:char*strtok_r(char *s, const char *delim, char**ptrptr)

 /*

  * linux/lib/string.c
  *
  * Copyright (C) 1991, 1992 Linus Torvalds
  */
  /*
  * stupid library routines.. The optimized versions should generally be found
  * as inline code in <asm-xx/string.h>
  *
  * These are buggy as well..

  *

  * * Fri Jun 25 1999, Ingo Oeser <ioe@informatik.tu-chemnitz.de>
  * - Added strsep() which will replace strtok() soon (because strsep() is
  * reentrant and should be faster). Use only strsep() in new code, please.
  *
  * * Sat Feb 09 2002, Jason Thomas <jason@topic.com.au>,
  * Matthew Hawkins <matt@mh.dropbear.id.au>
  * - Kissed strtok() goodbye

  */

对于strtok函数具体出问题原理是
应用函数初次调用strtok时传递一个字串的地址,比如”aaa.bbb.dddd”,并将字串的地址保存在自己的静态变量中,当你将来再次调用strtok并传递NULL时(strtok的特殊用法,第二次调用时字串传NULL表示对第一次传进去的字串继续分隔,所以要先保存字串地址,这是有点怪异的实现)该函数就会引用保存好的字串地址在多线程环境下,另一个线程也可能调用strtok在这种环境下,另一个线程会在第一个线程不知道的情况下替换静态变量中的字串地址,这就会导致各种难以排除的错误出现
其他线程不安全函数原理类似,解决办法是只要给这些全局变量或静态变量加锁就行了,不过我们一般都没机会改这些库,所以使用时就要小心。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值