strtok是thread unsafe的。一段典型的使用如下所示:
char string[] = "a string,of ,,tokens"; char* token = strtok(string," ,"); /*There are two delimiters here*/ while (token != NULL){ printf("The token is: %s\n", token); token = strtok(NULL," ,"); }
strtok( str_xxx, delimiters )最后一次执行后,所有线程中的strtok( NULL, delimiters )调用得到的值都将是str_xxx被split的结果,而无法得到各自线程的应有的结果。
linux平台的posix线程安全版本为strtok_r(),即reentrant strtok,通过增加参数,将token指针交给用户代码来存储。
windows平台则实现了线程安全版本的strtok()和strtok_s()。前者会为每个线程创建一个_tiddata结构,来存储每个线程各自的strtok()的token指针;后者则与strtok_r()一致。
一些常用的标准c函数,如使用全局seed的rand();又如在内部malloc buffer的strerror(int)等,都存在thread unsafe的问题,使用时要当心,以免埋下定时炸弹。