strtok and strtok_s
語言的運行庫為了支持多線程特性,必須做出一些改進。一種改進的辦法就是修改所有的線程不安全的函數的參數列表,改成某種線程安全的版本。比如MSVC的CRT就提供了線程安全版本的strtok()函數:strtok_s,它們的原型如下:
char *strtok(char *strToken, const char *strDelimit );
char *strtok_s( char *strToken, const char *strDelimit, char**context);
改進后的strtok_s增加了一個參數,這個參數context是由調用者提供一個char*指針,strtok_s將每次調用后的字符串位置保存在這個指針中。而之前版本的strtok函數會將這個位置保存在一個函數內部的靜態局部變量中,如果有多個線程同時調用這個函數,有可能出現沖突。與MSVCCRT類似,Glibc也提供了一個線程安全版本的strtok()叫做strtok_r()。
但是很多時候改變標準庫函數的做法是不可行的。標準庫之所以稱之為“標準”,就是它具有一定的權威性和穩定性,不能隨意更改。如果隨意更改,那么所有遵循該標準的程序都需要重新進行修改,這個“標準”是不是值得遵循就有待商榷了。所以更好的做法是不改變任何標準庫函數的原型,只是對標準庫的實現進行一些改進,使得它能夠在多線程的環境下也能夠順利運行,做到向后兼容。
總結
以上是生活随笔為你收集整理的strtok and strtok_s的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一场大梦-深造梦
- 下一篇: 文本处理工具命令xargs, sort,