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