设为首页 加入收藏

TOP

6.7.1 终止线程(1)
2013-10-07 12:58:44 来源: 作者: 【 】 浏览:56
Tags:6.7.1 终止 线程

6.7  管理线程

到此为止,我们已经谈论了如何创建线程、使用线程属性对象、创建可结合和分离的线程,以及返回线程id的方法。接下来我们将讨论如何管理线程。当创建有着多个线程的应用程序时,有多种方法可以控制线程的行为以及它们如何使用资源和竞争资源。管理线程中包含设置调度策略、线程优先级等部分,这能够提高线程的性能,因此也提高了应用程序的性能。线程的性能还由线程如何竞争资源所决定,无论是系统范围还是进程范围。可以通过使用线程属性对象来设置线程的调度策略、优先级和竞争范围。由于线程共享资源,因此对资源的访问必须加以同步。线程同步包含线程何时以及如何终止和取消。

6.7.1  终止线程(1)

当线程到达程序指令的结尾时,就会终止。当线程终止后,pthread库收回线程使用的系统资源并保存它的退出状态。线程也可能会在执行完它所有的指令之前,被另一个对等线程提前终止。线程可能已经破坏某些进程数据,因此必须被终止。

线程的执行可以通过几种方式来停止:

通过从它被分派的任务返回,返回时有或者没有退出状态或返回值

显式终止自身并提供一个退出状态

被相同地址空间中的其他线程取消

1. 自终止

线程可以通过调用pthread_exit( )来自终止。

调用形式

  1. #include <pthread.h> 
  2.  
  3. int pthread_exit(void *value_ptr); 

当可结合线程函数结束执行之后,它返回到将它作为目标线程调用pthread_join( )的线程。当终止的线程调用pthread_exit( )时,它在value_ptr中得到了退出状态。退出状态被返回到pthread_join( )。还没有执行的取消清理处理任务(cancellation cleanup handler task)与线程特有数据的析构器一起执行。

当调用这个函数时,线程所使用的资源不会被释放。应用程序可以看到的进程资源也不会被释放,如互斥量和文件描述符。不会执行进程级清理动作。当进程中最后一个线程退出时,进程终止,且退出状态为0。这个函数不能够返回到调用线程,也没有为它定义错误。

2. 终止对等线程

有时候一个线程有必要终止另一个对等线程。pthread_cancel( )用于终止对等线程。参数thread是要取消的线程。这个函数如果成功则返回0,如果不成功就返回一个错误。当参数thread不对应任何现有线程时,函数pthread_cancel( )会失败。

调用形式

  1. #include <pthread.h> 
  2.  
  3. int pthread_cancel(pthread_t thread); 

应用程序中可能会有一个线程监视其他线程的工作。如果某个线程执行不力或不再需要,为了节省系统资源,有必要终止该线程。用户可能期望取消执行中的操作。多个线程可能用于解决一个问题,但是一旦某个线程得到了解答,所有其他线程可以被监视线程或得到解答的线程取消。

对pthread_cancel( )的调用是取消一个对等线程的请求。这个请求可能立即被同意、稍后被同意、甚至被忽略。目标线程可能立即终止,或者延迟到它的执行中的某个逻辑点。线程可能必须在终止之前执行一些清理任务,线程也可以选择拒绝终止。

3. 理解取消过程

在取消一个对等线程的请求被同意时,会有一个取消过程同pthread_cancel( )的返回异步发生。目标线程的取消类型和取消状态决定了取消何时真正发生。可取消性状态描述了线程的取消状况为可取消或不可取消。线程的可取消性类型决定了线程在收到取消请求后继续执行的能力。可取消性状态和类型是由线程自己动态设置的。

调用线程的可取消性状态和类型是由pthread_setcancelstate( )和pthread_setcanceltype( )设置的。pthread_setcancelstate( )将调用线程设置为state所指定的可取消性状态,并将之前的状态在oldstate中返回。pthread_setcanceltype( ) 将调用线程设置为type所指定的可取消性类型,并将之前的类型在oldtype中返回。

调用形式

  1. #include <pthread.h> 
  2.  
  3. int pthread_setcancelstate(int state, int *oldstate);  
  4. int pthread_setcanceltype(int type, int *oldtype); 

用于设置线程取消状态的state和oldstate的值是:

  1. PTHREAD_CANCEL_DISABLE  
  2.  
  3. PTHREAD_CANCEL_ENABLE 

PTHREAD_CANCEL_DISABLE使得线程忽略取消请求。PTHREAD_CANCEL_ENABLE使得线程允许取消请求。PTHREAD_CANCEL_ENABLE是任何新近创建的线程的默认状态。如果成功,函数返回0。如果没有成功,函数返回一个错误号。如果没有传递有效的state值,则pthread_setcancelstate( )会失败。

函数pthread_setcanceltype( )将调用线程的可取消性状态设置为type指定的类型,并将之前的状态通过oldtype返回。type和oldtype的值可以为:

  1. PTHREAD_CANCEL_DEFFERED  
  2.  
  3. PTHREAD_CANCEL_ASYNCHRONOUS 

PTHREAD_CANCEL_DEFFERED使得线程推迟终止,直到它到达它的取消点。这是任何新近创建的线程的默认可取消性类型。PTHREAD_CANCEL_ASYNCHRONOUS使得线程立即终止。如果成功,函数返回0。如果不成功,函数返回一个错误号。如果没有传递有效的type,则pthread_setcanceltype( )会失败。

pthread_setcancelstate ( )和pthread_setcanceltype( )共同使用来建立线程的可取消性。表6-5列出了状态和类型的组合以及对每种组合的作用的描述。

表6-5

可取消性状态< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

可取消性类型

   

PTHREAD_CANCEL_ENABLE

PTHREAD_

CANCEL_DEFERRED

延迟取消;这是线程的

默认取消状态和类型;

当线程到达一个取消点

或程序员通过调用

pthread_testcancel( )

义的取消点时,会发

生线程的取消

PTHREAD_CANCEL_ENABLE

PTHREAD_CANCEL_

ASYNCHRONOUS

异步取消;立即发

生线程的取消

PTHREAD_CANCEL_DISABLE

Ignored

禁止取消;不会发

生线程的取消


请看示例6-3。

示例6-3

  1. // Example 6-3 task3 thread sets its cancelability state to allow thread  
  2. // to be canceled immediately.  
  3.  
  4. void *task3(void *X)  
  5. {  
  6.    int OldState,OldType;  
  7.  
  8.    // enable immediate cancelability  
  9.  
  10.    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,&OldState);  
  11.    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,&OldType);  
  12.  
  13.    ofstream Outfile("out3.txt");  
  14.    for(int Count = 1;Count < 100;Count++)  
  15.    {  
  16.       Outfile << "thread C is working: " << Count << endl;  
  17.  
  18.    }  
  19.    Outfile.close();  
  20.    return (NULL);  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇6.7.1 终止线程(2) 下一篇6.6.2 结合线程

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: