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,在这种环境下,另一个线程会在第一个线程不知道的情况下替换静态变量中的字串地址,这就会导致各种难以排除的错误出现。
其他线程不安全函数原理类似,解决办法是只要给这些全局变量或静态变量加锁就行了,不过我们一般都没机会改这些库,所以使用时就要小心。