以下哪些函数是线程安全的?
windows和linux下,sprint,sscanf,strlen,strcpy,strcmp,memcpy,memcmp,atoi,printf,scanf是否线程安全?
请指点一下,我找不到介绍说明。
ps:
是不是除了printf和scanf都是线程安全的?如果有介绍网址提供,那就更好了!
[解决办法]
LZ说的线程安全是指什么?
[解决办法]
这些函数都是不安全的。
[解决办法]
应该多是线程安全,前提是你要用多线程的运行时库
[解决办法]
都是不安全的,VC 2005里面会有警告。
安全的后面都有 _s
scanf_s ...
[解决办法]
你为什么认为printf和scanf都是线程安全的?
[解决办法]
线程安全都是骗人的,楼主不要轻信。
[解决办法]
多线程共同访问全局对象时应该考虑的是线程同步问题,避免访问时发生冲突。
[解决办法]
这些基本的函数不可能是线程安全的,
因为要保证线程安全是需要好多额外代码的。
所以lz需要做的是保证自己的类或函数是线程安全的即可。
[解决办法]
感觉所说的线程安全其实就是数据的安全,如果同时有N个相同线程运行的话可能会出现内存访问的问题,感觉只要对关键代码进行保护,进行线程同步处理可以避免错误的发生。
[解决办法]
对这方面没有研究过,亲听各位高手的解说。偷学。。呵呵~~
[解决办法]
发现,若printf中,函数多于两个,就会线程不安全。
#include<stdio.h>#include<process.h>#include<windows.h>#define SAMETIME 50#define TM1 SAMETIME#define TM2 SAMETIME#define TM3 SAMETIME#define TM4 SAMETIMEchar str[64];//#define SAFE#ifdef SAFECRITICAL_SECTION cs;#endifvoid f1(void* pv){ volatile bool* pbKill=(bool*)pv; while(!(*pbKill)) { Sleep(TM1);#ifdef SAFE EnterCriticalSection(&cs);#endif printf("%s",strcpy(str,"f1()\t")); // cout<<"f1()\t";#ifdef SAFE LeaveCriticalSection(&cs);#endif }#ifdef SAFE EnterCriticalSection(&cs);#endif printf("%s",strcpy(str,"\nf1()结束\t"));// cout<<"\nf1()结束\t";#ifdef SAFE LeaveCriticalSection(&cs);#endif _endthread();}void f2(void* pv){ volatile bool* pbKill=(bool*)pv; while(!(*pbKill)) { Sleep(TM2);#ifdef SAFE EnterCriticalSection(&cs);#endif printf("%s",strcpy(str,"f2()\t")); // cout<<"f2()\t";#ifdef SAFE LeaveCriticalSection(&cs);#endif }#ifdef SAFE EnterCriticalSection(&cs);#endif printf("%s",strcpy(str,"\nf2()结束\t"));// cout<<"\nf2()结束\t";#ifdef SAFE LeaveCriticalSection(&cs);#endif _endthread();}void f3(void* pv){ volatile bool* pbKill=(bool*)pv; while(!(*pbKill)) { Sleep(TM3);#ifdef SAFE EnterCriticalSection(&cs);#endif printf("%s",strcpy(str,"f3()\t")); // cout<<"f3()\t";#ifdef SAFE LeaveCriticalSection(&cs);#endif }#ifdef SAFE EnterCriticalSection(&cs);#endif printf("%s",strcpy(str,"\nf3()结束\t"));// cout<<"\nf3()结束\t";#ifdef SAFE LeaveCriticalSection(&cs);#endif _endthread();}int main(){ system("PAUSE"); bool bKill=false; int i=0;#ifdef SAFE InitializeCriticalSection(&cs);#endif _beginthread(f1,0,&bKill); _beginthread(f2,0,&bKill); _beginthread(f3,0,&bKill); for(;i<40;) { Sleep(TM4);#ifdef SAFE EnterCriticalSection(&cs);#endif printf("%s%d%s",strcpy(str,"man("),++i,strcpy(str+32,")\t"));// cout<<"main("<<i<<")\t";#ifdef SAFE LeaveCriticalSection(&cs);#endif } system("PAUSE"); bKill=true; system("PAUSE");#ifdef SAFE EnterCriticalSection(&cs);#endif printf("%s",strcpy(str,"\n程序结束\n"));// cout<<"\n程序结束\n";#ifdef SAFE LeaveCriticalSection(&cs);#endif return 0;}
[解决办法]
帮顶下吧!
[解决办法]
在多线程 版本下 理论都是安全的
[解决办法]
都不安全