关于类中线程的有关问题

关于类中线程的问题
#include<iostream>
#include<windows.h>  
#include<process.h>  
using namespace std;
class thread //线程操作
{
public:
void t_thread()
{
int pid1,pid2,i;
::InitializeCriticalSection(&pcs1); //初始化临界区
::InitializeCriticalSection(&pcs2);
::InitializeCriticalSection(&pcs1_2);
while((pid1=_beginthread(p1,0,NULL))==-1); //创建线程
while((pid2=_beginthread(p2,0,NULL))==-1);
Sleep(2); //挂起2毫秒,防止主线程抢占临界区
EnterCriticalSection(&pcs1); //申请进入进入临界区(等待线程p1与p2完成)
EnterCriticalSection(&pcs2);
for(i=1;i<27;i++)
cout<<i<<" "; //输出数字1-26
cout<<endl;
LeaveCriticalSection(&pcs1); //离开临界区
LeaveCriticalSection(&pcs2);
system("pause"); //防止主进程结束引起程序提前结束(此项为设置临界区之前所作的更改,设置临界区之后理论上可以删除)
}
private:
  void p1(void*); //线程1声明
void p2(void*); //线程2声明
CRITICAL_SECTION pcs1,pcs2,pcs1_2; //创建临界区(主要作用为让主线程等待线程1,2输出完毕)
void p1(void*) //线程1
{
EnterCriticalSection(&pcs1); //申请进入临界区1(阻止主线程进行输出)
char i;
for(i='A';i<='Z';i++)
{
EnterCriticalSection(&pcs1_2);
cout<<i<<" "; //输出大写字母A-Z
LeaveCriticalSection(&pcs1_2);
Sleep(1); //挂起1毫秒(让线程2输出)
}
LeaveCriticalSection(&pcs1); //离开临界区1(线程1输出完毕)
_endthread(); //结束线程1
}
void p2(void*) //线程2
{
EnterCriticalSection(&pcs2); //申请进入临界区2(阻止主线程进行输出)
char i;
for(i='a';i<='z';i++)
{
EnterCriticalSection(&pcs1_2);
cout<<i<<" "; //输出小写字母a-z
LeaveCriticalSection(&pcs1_2);
Sleep(1); //挂起1毫秒(让线程1输出)
}
LeaveCriticalSection(&pcs2); //离开临界区2(线程2输出完毕)
_endthread(); //结束线程2
}

/*p.s.若程序Debug为error C2065: '_beginthreadx ' : undeclared identifier等,需调整VC中的Debug,具体方法为Project->settings,选择C/C++页,
Category选择Code Generation,其中的Ues run-time libarary选择MultiThreaded/MultiThreaded DLL/Debug MultiThreaded/Debug MultiThreaded DLL中任意一项*/
//p.s2.可能还会偶发主线程抢占临界区的情况,可以适当增大主线程中Sleep()中的数值
};
int main()
{
int a;
cout<<"\t\t\t\t实验程序"<<endl;
cout<<"1.多线程操作"<<endl;
switch(a)
{
case 1:
thread::t_thread;
}
return 0;
}


error C2535: 'void __thiscall thread::p1(void *)' : member function already defined or declared
  E:\学习\VC\linux\linux.cpp(27) : see declaration of 'p1'
error C2535: 'void __thiscall thread::p2(void *)' : member function already defined or declared
  E:\学习\VC\linux\linux.cpp(28) : see declaration of 'p2'


这个程序的错误不太明白,谁能帮我解释一下

------解决方案--------------------
像你这种应该用static的
C/C++ code
#include<iostream>
#include<windows.h>   
#include<process.h>   
using namespace std;
CRITICAL_SECTION pcs1,pcs2,pcs1_2; //创建临界区(主要作用为让主线程等待线程1,2输出完毕)

class thread //线程操作
{
public:
    static void t_thread()
    {
        int pid1,pid2,i;
        ::InitializeCriticalSection(&pcs1); //初始化临界区
        ::InitializeCriticalSection(&pcs2);
        ::InitializeCriticalSection(&pcs1_2);
        while((pid1=_beginthread(p1,0,NULL))==-1); //创建线程
        while((pid2=_beginthread(p2,0,NULL))==-1);
        Sleep(2); //挂起2毫秒,防止主线程抢占临界区
        EnterCriticalSection(&pcs1); //申请进入进入临界区(等待线程p1与p2完成)
        EnterCriticalSection(&pcs2);
        for(i=1;i<27;i++)
            cout<<i<<" "; //输出数字1-26
        cout<<endl;
        LeaveCriticalSection(&pcs1); //离开临界区
        LeaveCriticalSection(&pcs2);
        system("pause"); //防止主进程结束引起程序提前结束(此项为设置临界区之前所作的更改,设置临界区之后理论上可以删除)
    }
private:
    //void p1(void*); //线程1声明
    //void p2(void*); //线程2声明
    static void p1(void*) //线程1
    {
        EnterCriticalSection(&pcs1); //申请进入临界区1(阻止主线程进行输出)
        char i;
        for(i='A';i<='Z';i++)
        {
            EnterCriticalSection(&pcs1_2);
            cout<<i<<" "; //输出大写字母A-Z
            LeaveCriticalSection(&pcs1_2);
            Sleep(1); //挂起1毫秒(让线程2输出)
        }
        LeaveCriticalSection(&pcs1); //离开临界区1(线程1输出完毕)
        _endthread(); //结束线程1
    }
    static void p2(void*) //线程2
    {
        EnterCriticalSection(&pcs2); //申请进入临界区2(阻止主线程进行输出)
        char i;
        for(i='a';i<='z';i++)
        {
            EnterCriticalSection(&pcs1_2);
            cout<<i<<" "; //输出小写字母a-z
            LeaveCriticalSection(&pcs1_2);
            Sleep(1); //挂起1毫秒(让线程1输出)
        }
        LeaveCriticalSection(&pcs2); //离开临界区2(线程2输出完毕)
        _endthread(); //结束线程2
    }

    /*p.s.若程序Debug为error C2065: '_beginthreadx ' : undeclared identifier等,需调整VC中的Debug,具体方法为Project->settings,选择C/C++页,
    Category选择Code Generation,其中的Ues run-time libarary选择MultiThreaded/MultiThreaded DLL/Debug MultiThreaded/Debug MultiThreaded DLL中任意一项*/
    //p.s2.可能还会偶发主线程抢占临界区的情况,可以适当增大主线程中Sleep()中的数值
};
int main()
{
    int a;
    cout<<"\t\t\t\t实验程序"<<endl;
    cout<<"1.多线程操作"<<endl;
    switch(a)
    {
    case 1:
        thread::t_thread();
    }
    return 0;
}