多线程编程-线程的创建和终止

 

1.引言:

Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。顺便说一下,Linux下pthread的实现是通过系统调用clone()来实现的。clone()是Linux所特有的系统调用,它的使用方式类似fork,关于clone()的详细情况,有兴趣的读者可以去查看有关文档说明。

  pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义:

  typedef unsigned long int pthread_t;

它是一个线程的标识符。

2.函数说明:

(1)函数原型:

#include

int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr, void *(*start_rtn)(void),void *restrict arg);

返回值:若是成功建立线程返回0,否则返回错误的编号

形式参数:

pthread_t *restrict tidp 要创建的线程的线程id指针

const pthread_attr_t *restrict attr 创建线程时的线程属性

void* (start_rtn)(void) 返回值是void类型的指针函数

void *restrict arg start_rtn的行参

例题1:

功能:测试建立一个新的线程

程序名称: pthread_test.c

#include

#include

void *create(void *arg)

{

printf("new thread created ..... ");

}

int main(int argc,char *argv[])

{

pthread_t tidp;

int error;

error=pthread_create(&tidp,NULL,create,NULL);

if(error!=0)

{

printf("pthread_create is not created ... ");

return -1;

}

printf("prthread_create is created... ");

return 0;

}

编译方法:

#gcc -Wall -lpthread pthread_test.c

因为pthread的库不是linux系统的库,所以在进行编译的时候要加上-lpthread,否则编译不过,会出现下面错误:

thread_test.c: 在函数 ‘create’ 中:

thread_test.c:7: 警告: 在有返回值的函数中,程序流程到达函数尾

/tmp/ccOBJmuD.o: In function `main':thread_test.c:(.text+0x4f):对‘pthread_create’未定义的引用

collect2: ld 返回 1

2、线程的终止与结束

(1) 终止线程

函数原型:void pthread_exit(void *status);

参数:其中*retval为线程退出的状态。这个函数一般在线程中途退出时使用。

作用:此函数的作用是使当前线程退出并释放它使用的线程相关资源。

返回值: 当调用线程是进程中的最后一个非守护线程,进程将用状态0退出。当最初的线程从main()函数中返回时进程用该线程main函数的返回值退出。

(2) 等待线程结束

原型如下:

int pthread_join(pthread_t th, void **thread_return)

参数:th 为被等待的线程标识符

thread_return 为一个用户定义的指针,它可以用来存储被等待线程的返回值

作用:函数pthread_join用来等待一个线程的结束。

说明: 这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。此函数用于进程和线程的同步,防止主线程提前结束,致使其它线程无法执行。如主线程创建了两个线程,就有可能在两个派生线程没有执行时,主线程就已经结束了,而主线程结束,对系统而言,就意味这个进程已经结束,那么派生线程自然就没有机会执行了。所以用pthread_join等待派生线程的结束

返回值:调用成功时返回0,否则将返回一个非0的错误代码。

(3)分离线程pthread_detach

int pthread_detach(pthread_t tid);

作用:将非分离的线程设置为分离线程。即通知线程库在指定的线程终止时回收线程占用的内存等资源。

返回值:函数成功返回0。任何其他返回值都表示错误。

在一个线程上使用多次pthread_detach的结果是不可预见的。

(4)线程的取消

当我们希望终止一个线程时,我们可以使用函数pthread_cancel()。其原型定义如下:

原型: int pthread_cancel(pthread_t thread);

说明:这个函数以一个线程ID作为参量,向此线程发送一个取消请求。线程处理这个请求的方式取决于线程的状态。它可能立即作出反映,也可能等到它得到一个取消点时在行动,也可能完全忽略它。

(5)设置线程取消状态

线程可以用pthread_setcancelstate函数来设置自己的取消状态,

原型定义如下:int pthread_setcancelstate(int state, int *oldstate);

参数说明:

state 取值可以是PTHREAD_CNACEL_ENABLE,这个值允许线程接收取消请求;或是PTHREAD_CNACEL_ENABLE,它的作用是忽略取消请求。

oldstate 用于获取先前的取消状态。如果取消请求接受了,线程可以进入第二个控制层次,用pthread_setcanceltype设置取消类型。

(6)设置取消类型

原型定义如下:int pthread_setcanceltype(int type, int *oldtype);

参数说明:

type 取值可以是PTHREAD_CANCEL_ASYNCHRONOUS,它将使得线程在接收到取消请求后立即处理(asynchronous),或是PTHREAD_CANCEL_DEFERRED,它将使得线程在接收到取消请求后,一直推迟处理,直到遇到一个取消点(defer)之后才处理。

odtype 作用是允许保存先前的状态,如果不想直到先前的状态,可以传递NULL给它。

在默认的情况下,线程在启动是的取消状态为PTHREAD_CNACEL_ENABLE,取消类型为PTHREAD_CANCEL_DEFERRED。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验目的 (1)掌握Windows系统提供的线程创建与撤销系统调用 (2)掌握Windows系统环境下线程创建与撤销方法 2 实验准备知识 (1)线程创建 CreateThread()完成线程创建。它在调用进程的地址空间上创建一个线程,执行指定的函数,并返回新建立线程的句柄。 原型: HANDLE CreateThread(   LPSECURITY_ATTRIBUTES lpThreadAttributes,   DWORD dwStackSize,   LPTHREAD_START_ROUTINE lpStartAddress,   LPVOID lpParameter,   DWORD dwCreationFlags,   LPDWORD lpThreadId);   参数说明:   lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL,表示使用缺省值。   dwStackSize,线程堆栈大小,一般=0,在任何情况下,Windows根据需要动态延长堆栈的大小。   lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:   DWORD WINAPI ThreadProc (LPVOID pParam) ,格式不正确将无法调用成功。   lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。   dwCreationFlags :线程标志,可取值如下   CREATE_SUSPENDED: 创建一个挂起的线程   0 :创建后立即激活。   lpThreadId:保存新线程的id。   返回值:   函数成功,返回线程句柄;函数失败返回false。 (2)撤销线程 ExitThread()用于撤销当前线程 原型: VOID ExitThread( DWORD dwExitCode ); 参数说明: DwExitCode:指定线程返回码 返回值: 该函数没有返回值 用法举例: ExitThread(0); (3)挂起线程 Sleep()用于挂起当前正在执行的线程 原型: VOID Sleep( DWORD dwMilliseconds ); 参数说明: dwMilliseconds:指定挂起时间,单位为ms(毫秒)。 返回值: 该函数没有返回值。 (4)关闭句柄 函数CloseHandle()用于关闭已打开对象的句柄,其作用与释放动态申请的内存空间类似,这样可以释放系统资源,使进程安全运行。 原型: BOOL CloseHandle( HANDLE hObject ); 参数说明: hObject:已打开对象的句柄。 返回值: 成功,返回值为非0值;失败,则返回值为0.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值