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

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