`
peizhiinfo
  • 浏览: 1425063 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多


转载:http://software.intel.com/zh-cn/blogs/2011/09/22/400007583/

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。


分享到:
评论

相关推荐

    Window下多线程编程、Linux下多线程编程-多线程实验bistu

    (1)基于CreateThread实现多线程,并实现线程的恢复、暂停、终止等。 (2)基于Beginthread实现多线程,并实现线程的简单同步。 (3)实现多线程字符串查找程序 Linux: (1)实现多线程字符输出,存在三个线程,...

    多线程编程(完整版)

    多线程编程 完美介绍多线程想过技术  进程和线程都是操作系统的概念。进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而...

    linux多线程编程

    linux多线程编程 声明:本文是网上整理的资料,版权属其作者本人所有。 1 第一章 线程基础知识 2 一.什么是线程 2 二.线程的优点 2 三.线程的缺点 2 四.线程的结构 2 五.线程标识 2 六.线程的创建 3 七..线程...

    08.多线程编程基础-停止线程-使用stop方法强行终止线程.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    c++多线程编程初学实例一.docx

    本文介绍了CPU多线程编程技术的方法。非常简单实用。线程是进程内部的一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点...

    windows下vc多线程编程

    本程序在VC环境中实现多线程编程。MultiThread有助于大家学习windows环境下的多线程编程。希望对大家能有所帮助。 hStdOut = GetStdHandle( STD_OUTPUT_HANDLE ); /* Get display screen's text row and column ...

    MFC多线程编程多线程概述

    MFC多线程编程多线程概述  进程和线程都是操作系统的概念。进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所...

    多线程编程指南PDF

    多线程基础介绍.........................................................................................................................................15 定义多线程术语...................................

    多线程服务器编程

    多线程编程 要讲解线程,不得不说一下进程,进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它系统资源组成。进程在运行时创建的资源随着进程的终止而死亡。线程的基本思想很简单,它是...

    linux多线程编程按键退出

    在Linux多线程编程例子—生产者与消费者的实验基础上,实现即时“ESC”按键结束所有线程并退出。

    java并发编程:线程基础

    本资源致力于向您介绍 Java 并发编程中的线程基础,涵盖了多线程编程的核心概念、线程的创建和管理,以及线程间通信的基本方法。通过深入学习,您将建立扎实的多线程编程基础,能够更好地理解和应用多线程编程。 多...

    C++多线程编程

    C++ 多线程编程文档。包括对进程和线程的概念、线程的创建、终止等等详细的介绍,以及案例。

    多线程编程模型API

    《多线程编程模型》 注:多线程相关知识包括: 1. 多线程中各种 对象的 概念 2. OS的多线程 各种 对象的api 注:操作系统的多线程(或多进程)相关各种 对象的API主要包括以下几类: 1. 线程(或进程)的创建和终止...

    android 网络应用轻量框架-多线程管理-高效缓存-设计模式

    6:使用状态模式 观察者模式更好的处理多线程 最初的想法:网络优化开发框架 (移除任务未完成) 网络稳定,系统运行稳定性,大内存消耗稳定,长时间运行稳定性 (旧的系统症结所在) 开启过多线程,导致系统...

    VC 初级多线程编程实例源码集.rar

    个人整理的一些比较基础的VC 初级多线程编程实例集,包括安全终止线程、创建UI线程、创建Worker线程、等待线程结束、挂起和恢复线程、获得线程的退出码、使用互斥量、使用临界区、使用信号量等内容,相信对VC 初学者...

    Posix_线程编程指南

    Posix_线程编程指南,包括线程创建,取消,私有数据,同步,终止等方面

    多线程编程系列

    进程和线程都是操作系统的概念。进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而...主执行线程终止了,进程也就随之终止。

    VS2010 同步TCP SOCKET应用编程 服务器 客户端 消息解析 多线程

    利用TCP协议和同步套接字以及多线程编写 在监听线程中,服务器一旦接受一个连接,就创建一个与该玩家对应的线程,用于接收该玩家发送的信息,并根据该玩家发送的信息提供相应的服务。 有多少个玩家连接,就创建多少...

    基于c/c++的MFC的多线程

    1、创建和终止线程  在MFC程序中创建一个线程,宜调用AfxBeginThread函数。该函数因参数不同而具有两种重载版本,分别对应工作者线程和用户接口(UI)线程。  工作者线程 CWinThread *AfxBeginThread(  AFX_...

    Posix线程编程指南.rar

    1.2 创建线程 1.3 线程创建属性 1.4 线程创建的Linux实现 2.线程取消 2.1 线程取消的定义...线程终止 5.1线程终止方式 5.2线程终止时的清理 5.3线程终止的同步及其返回值 ... .. .

Global site tag (gtag.js) - Google Analytics