win32C语言多线程
Win32下C语言多线程操作
曹玉坤
2011-7-12
目 录
1概述3
2函数讲解3
3实例应用4
4总结7
概述
多线程的操作为我们提供了一种多任务,并发的工作方式,提高了工作效率。并且在很多场合我们需要程序能够同时进行多个操作,这是就用到了多线程。
说起多线程,我们首先了解一下几个基本概念。
首先是进程,一个程序开始运行,那么它就是一个进程,包括程序本身及程序所用到的内存和其他资源。
其次是线程,线程是程序中的一个执行流。每个线程都有自己的寄存器等等,但代码区是共享的。
再次我们说说进程和线程之间的关系。一个进程中可以包含一个或多个线程。只有一个的我们称之为单线程程序,有多个线程的我们称之为多线程程序,即包含多个执行流,各个线程执行不同的任务,合作完成程序的功能。
函数讲解
我们先来讲解要用到的头文件及函数。在这里我们接受_beginthread()函数和_endthread()函数。这两个函数是配对使用的,且都包含在process.h头文件里。
_beginthread()用了创建新的除主线程外的新的线程。创建成功返回新线程的编号,失败返回-1。包含三个参数,分别是线程执行流调用的函数、线程堆栈的深度(通常为0,系统按需求自动分配)和传入函数的参数。
_endthread()函数没有参数,用于关闭当前线程。
下面我们来通过一个实例来详细讲解其用法。
实例应用
我们在一段程序中演示创建新的线程,并通过标识来理解其工作原理。
首先我们先看看代码:
#include
#include
#include
void testFun(int *a)
{
int i=0,b=10;
for(i=0;i<4;i++)
{
printf("this is the thread we created %d\n" , a[i]);
}
printf(" this is b = %d",b);
_endthread();
}
main()
{
int j=0,b=10;
int a[4]={0,1,2,3};
int hand=-1;
hand=_beginthread(testFun,0, &a);
if(hand==-1)
{
printf("thread creating failed\n");
}
else
{
printf("thread created sucessfully %d\n\n",hand);
}
for(j=0;j<10;j++)
{
printf("this is the main thread\n");
}
}
这段代码很简单,就是在主程序中显示标识,在新建线程中显示标识。我们通过其显示结果来理解线程的工作方式。
通过结果我们可以看到,主程序中的标识,和线程中的标识都被执行,且其顺序是随机的。
总结
在做的过程中大家可能会遇到一些小问题。这里我先讲两个。
第一:新线程的函数传递问题,怎样才能传递多个参数呢?因为传参是地址传递,我解决的办法是将参数放在同一个数组里,当然如果是不同类型的,可以尝试采用结构体。
第二: 在编译时,报出_beginthread()不可知的错误。这个是因为在创建工程时,将工程创建为单线程程序的问题。我们只需要修改如图中的 use run-time library 为debug multithreaded就可以了。