转自:http://blog.csdn.net/caohao2008/article/details/6981423
这几天调bug,该bug的特点是随机出现,而且不可重现!找了一天之后,终于发现,是因为在多线程函数中用了线程不安全的strtok函数导致的。
从网上搜了些资料,
多线程环境小心多线程不安全函数:strtok、asctime、ctime、gmtime and soo
改成线程安全的函数strtok_r即可。
strtok不是一个线程安全的函数,多线程下应该用strtrok_r
这个函数的定义:char*strtok_r(char *s, const char *delim, char**ptrptr);
最后一个参数是和strtok不同的,使用方法如下:
char str_buf[] = "This is a buffer.";
char seg[10] = " ";
char * buffer = NULL;
token = strtok_r(str_buf, seg,&buffer);
while(token != NULL)
{
}
多线程不安全的函数列表可以参考:
http://kernel.org/doc/man-pages/online/pages/man7/pthreads.7.html
asctime() basename() catgets() crypt() ctermid() if passed a non-NULL argument ctime() dbm_clearerr() dbm_close() dbm_delete() dbm_error() dbm_fetch() dbm_firstkey() dbm_nextkey() dbm_open() dbm_store() dirname() dlerror() drand48() ecvt() [POSIX.1-2001 only (function removed in POSIX.1-2008)] encrypt() endgrent() endpwent() endutxent() fcvt() [POSIX.1-2001 only (function removed in POSIX.1-2008)] ftw() gcvt() [POSIX.1-2001 only (function removed in POSIX.1-2008)] getc_unlocked() getchar_unlocked() getdate() getenv() getgrent() getgrgid() getgrnam() gethostbyaddr() [POSIX.1-2001 only (function removed in POSIX.1-2008)] gethostbyname() [POSIX.1-2001 only (function removed in POSIX.1-2008)] gethostent() getlogin() getnetbyaddr() getnetbyname() getnetent() getopt() getprotobyname() getprotobynumber() getprotoent() getpwent() getpwnam() getpwuid() getservbyname() getservbyport() getservent() getutxent() getutxid() getutxline() gmtime() hcreate() hdestroy() hsearch() inet_ntoa() l64a() lgamma() lgammaf() lgammal() localeconv() localtime() lrand48() mrand48() nftw() nl_langinfo() ptsname() putc_unlocked() putchar_unlocked() putenv() pututxline() rand() readdir() setenv() setgrent() setkey() setpwent() setutxent() strerror() strsignal() [Added in POSIX.1-2008] strtok() system() [Added in POSIX.1-2008] tmpnam() if passed a non-NULL argument ttyname() unsetenv() wcrtomb() if its final argument is NULL wcsrtombs() if its final argument is NULL wcstombs() wctomb()这些函数都是线程不安全的。
strtok函数线程不安全。
-
顶
- 0