线程中使用strtok

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的问题,使用时要当心,以免埋下定时炸弹。