首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

以下哪些函数是线程安全的?该怎么解决

2012-05-06 
以下哪些函数是线程安全的?windows和linux下,sprint,sscanf,strlen,strcpy,strcmp,memcpy,memcmp,atoi,pri

以下哪些函数是线程安全的?
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 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;} 


[解决办法]
帮顶下吧!
[解决办法]
在多线程 版本下 理论都是安全的
[解决办法]
都不安全

热点排行