需要在VC中设置好使用多线程运行时库,否则程序无法识别_beginthread函数,运行时需要在命令行带参运行。例如mt 0 30 30 0 0表示多线程,主线程和从线程计数均为20,均不发声。
/**************************
Wandy Wang 2005-3-27
单线程与多线程演示程序
***************************/
// compile with: /MT /D "_X86_" /c
#i nclude <windows.h>
#i nclude <stdio.h>
#i nclude <process.h>
#i nclude <dos.h>
#i nclude <string.h>
int t1Snd,t2Snd;
//线程函数
void fun(void* para)
{
int i=0;
for(i=0;i<=atoi((char*)para);i++)
{
printf("+++++i=%d/n",i);
if(t2Snd) MessageBeep(MB_ICONEXCLAMATION);
}
}
//主函数
void main(int argc,char* argv[])
{
//函数介绍及使用提示
printf( "演示但线程与多线程区别的程序/n");
//参数解析说明
//0 路径
//1 程序类型 1单线程 0多线程
//2 主线程计数值
//3 次线程计数值
//4 主线程发声与否
//5 从线程发声与否
int single,t1Cnt,t2Cnt;
if(argc!=6)
{
printf("参数个数不对,必须为6个参数");
printf("/n正确调用方式:mt 1 30 30 0 0/n参数解释:多线程,主线程计数,从线程计数,主线程不发声,从线程不发声/n参数可以相应改变,须在命令行下执行/n");
getchar();
return;
}
else
{
single=atoi(argv[1]);
t1Cnt=atoi(argv[2]);
t2Cnt=atoi(argv[3]);
t1Snd=atoi(argv[4]);
t2Snd=atoi(argv[5]);
printf("/n可执行文件名:%s",argv[0]);
printf("/n程序类型:%s",single?"单线程":"多线程");
printf("/n主线程计数值:%d",t1Cnt);
printf("/n次线程计数值:%d",t2Cnt);
printf("/n主线程发声与否:%s",t1Snd?"是":"否");
printf("/n从线程发声与否:%s",t2Snd?"是":"否");
}
//等待开始
getchar();
char string[10];
//单线程或创建多线程输出
if(single)
{
fun((void*)itoa(t2Cnt,string,10));
}
else
{
_beginthread(fun,0,(void*)itoa(t2Cnt,string,10));//创建新线程
}
//主线程输出
int j=0;
for(j=0;j<=t1Cnt;j++)
{
printf("-----j=%d/n",j);
if(t1Snd) MessageBeep(MB_ERROR);
}
//输出完后暂停看屏幕输出
getchar();
}