以下哪些函数是线程安全的?该怎么解决
以下哪些函数是线程安全的?
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中,函数多于两个,就会线程不安全。
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中,函数多于两个,就会线程不安全。
- C/C++ code
#include<stdio.h> #include<process.h> #include<windows.h> #define SAMETIME 50 #define TM1 SAMETIME #define TM2 SAMETIME #define TM3 SAMETIME #define TM4 SAMETIME char str[64]; //#define SAFE #ifdef SAFE CRITICAL_SECTION cs; #endif void 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; }