当前位置:编程学习 > C/C++ >>

VC++上怎么用C++实现多线成?

如题。写一段简单易懂的代码,实现多线程,希望注释的清楚点一些,谢谢大家哈
答案:C/C++ 简单的多线编程 fibonacci序列

/*
多线程编程:创建一个线程来产生fibonacci
*/
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>

DWORD WINAPI ThreadProc(LPVOID lpParameter);//线程的执行函数

int a,b,c,number;

int main(int argc,char *argv[])
{
a=1;
b=1;
if(argc!=2)
{
printf("Error:filename number \n");
exit(0);
}
number=atoi(argv[1]);
if(number>2)
{
/*创建线程*/
HANDLE hThread=CreateThread(NULL,0,ThreadProc,NULL,0,NULL);

CloseHandle(hThread);//关闭表示线程的句柄

Sleep(10); //主线程放弃执行权,以使线程得到执行机会
}
else if(number==2)
printf("%d %d",a,b);
else if(number==1)
printf("%d",a);
return 0;
}

DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
printf("%d %d ",a,b);
int i;
for(i=3;i<=number;i++)
{
c=a+b;
a=b;
b=c;
printf("%d ",c);
}

return 0;
}

「注意1」由于创建线程所使用的函数CreateThread()是windows API函数,所以,必须包含头文件windows.h

  「注意2」CreateThread()函数有一个HANDLE 类型的返回值,用来标识创建的线程,因此,应该定义一个HANDLE类型的变量用于保存这个句柄(不是必须)。线程创建完成之后,如果不需要使用这个句柄变量,应当将其关闭,以释放系统资源。关闭句柄的方法是调用CloseHandle()函数。

  「注意3」这里的Sleep()函数的作用是使主线程放弃执行机会,让其它线程开始执行。因为这个程序主线程内运行的代码很短,就两条短语句,同常情况,这两条语句在一个系统时间片内就能跑完,然后就执行return语句返回,主线程就运行结束了。主线程一结束,程序就终止,线程1和线程2将再也得不到执行机会。我们可以将Sleep()注释起来,然后运行程序,观察打印出来的sum值即可以发现线程1和线程2是否得到运行机会。当然,Sleep()不是必须的,这从系统调度线程的方式可以看出来,多线程程序在开始运行时,系统会首先让主线程执行一段时间(时间片),如果主线程在这个时间段内将所有代码都执行完了,程序就结束,否则,就将主线程挂起,然后让其他线程执行同样的一段时间,时间到了之后,该线程挂起,又返回主线程开始执行,主线程再执行同样的一段时间,然后再挂起,跳到其他线程执行,如此不断循环,直到主线程完全执行完毕为止。由此可见,要想让非主线程能够被完整执行,那么只要使它获得的时间片的总和大于或等于该线程连续执行完毕所需要的时间即可。基于此原理,我们想到,只要让主线程被多次挂起即可使非主线程获得多个执行时间片。那么,如何让主线程多次被挂起呢?很简单,只要让主线程连续执行完毕所需要的时间是系统时间片的N倍即可,具体N等于多少合适,那需要视其他线程完整执行需要多少时间。我们实验一下,把调用Sleep()那行代码注释起来,然后在那里写上如下代码:

  //Sleep(5);

  for(int i=0;i<1000000;i++){}

  这个for循环什么事也不做,就是延长主线程的执行时间,使主线程在一个时间片里执行不完,分成在若干个时间片里执行。运行程序,可以发现,输出的sum值等于6,符合预期,说明,线程1和线程2都得到了执行。

上一个:不学C语言可以直接学C++吗
下一个:c++的拷贝构造函数的多文件问题

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,