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

关于类中线程的有关问题

2012-08-08 
关于类中线程的问题#includeiostream#includewindows.h#includeprocess.husing namespace stdclass

关于类中线程的问题
#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;} 

热点排行