精华内容
参与话题
问答
  • Linux线程终止

    2013-06-20 10:18:35
    Linux线程终止  如果进程中任一线程调用exit, _Exit, _exit, 整个进程终止. 这不是线程终止, 而是进程, 这将终止该进程中的所有线程.   1. 线程终止的方式:  单个线程可以通过3种方式退出: 从...

    Linux线程终止  


    如果进程中任一线程调用exit, _Exit, _exit, 整个进程终止. 这不是线程终止, 而是进程, 这将终止该进程中的所有线程.

     

    1. 线程终止的方式:

        单个线程可以通过3种方式退出:

    • 从启动例程中返回, 返回值是线程的退出码.
    • 被同一进程中的其他线程取消(pthread_canel( pthread_t tid).
    • 调用pthread_exit.

     

    2. pthread_exit函数:

    • 原型: void pthread_exit(void *rval_ptr);
    • 头文件: <pthread.h>
    • 参数: rval_ptr是一个无类型指针, 指向线程的返回值存储变量.

     

    3. pthread_join函数:

    • 原型: int pthread_join(pthread_t thread, void **rval_ptr);
    • 头文件: <pthread.h>
    • 返回值: 成功则返回0, 否则返回错误编号.
    • 参数:
      • thread: 线程ID.
      • rval_ptr: 指向返回值的指针(返回值也是个指针).
    • 说明:
      • 调用线程将一直阻塞, 直到指定的线程调用pthread_exit, 从启动例程返回或被取消.
      • 如果线程从它的启动例程返回, rval_ptr包含返回码.
      • 如果线程被取消, 由rval_ptr指定的内存单元置为: PTHREAD_CANCELED.
      • 如果对返回值不关心, 可把rval_ptr设为NULL.

     

    4. 实例:

    main.c 代码:

    #include <pthread.h>
    #include 
    <stdio.h>


    /* print process and thread IDs */
    void printids(const char *s)
    {
        pid_t pid, ppid;
        pthread_t tid;

        pid 
    = getpid();
        ppid 
    = getppid();
        tid 
    = pthread_self();

        printf(
    "%16s pid %5u ppid %5u tid %16u (0x%x) "
                 s, (unsigned 
    int)pid, (unsigned int)ppid,
                 (unsigned 
    int)tid, (unsigned int)tid);
    }


    /* thread process */
    void *thread_func(void *arg);
    {
        printids(
    "new thread: ");
        
    return (void *)108;
    }


    /* main func */
    int main()
    {
        
    int err;
        
    void *tret; /* thread return value */
        pthread_t ntid;

        err 
    = pthread_create(&ntid, NULL, thread_func, NULL);
        
    if (err != 0)
            perror(
    "can't create thread");

        err 
    = pthread_join(ntid, &tret);
        
    if (err != 0)
            perror(
    "can't join thread");

        printids(
    "main thread: ");
        printf(
    "thread exit code: %d ", (int)tret);
        sleep(
    1);

        
    return 0;
    }

    这段代码是通过前一个实例改编的, 执行流程如下:

    • 首先创建一个新线程, 该线程在打印完IDs后, 返回108.
    • 然后用pthread_join获取该线程返回值, 存于tret中.
    • 主线程打印IDs.
    • 主线程打印tret, 即新线程的返回值.

     

    5. pthread_cancel函数:

    • 原型: int pthread_cancel(pthread_t tid);
    • 头文件: <pthread.h>
    • 返回值: 成功则返回0, 否则返回错误编号.
    • 说明:
      • 等同于调用了参数为PTHREAD_CANCELED的pthread_exit.
      • cancel并不等待线程终止, 它仅仅是提出请求.
      • 线程可以选择忽略取消方式或是控制取消方式.
    展开全文
  • 主动终止终止自己) 调用 return (void*)var; 调用void pthread_exit(void *value_ptr), 其它线程可以调用 pthread_join 获得这个针。 注: 这两个函数返回值都为指针类型,在线程中使用时所指向的地址必须为...
    • 主动终止(终止自己)

    调用 return (void*)var;
    调用void pthread_exit(void *value_ptr), 其它线程可以调用 pthread_join 获得这个针。

    注:
    这两个函数返回值都为指针类型,在线程中使用时所指向的地址必须为:malloc分配的或者全局变量;因为当线程退出是 其作用域的变量都将消失。
    这两个函数的返回值都能通过 int pthread_join(pthread_t thread, void **value_ptr) 获取,线程结束但线程所占用的资源并 没有立即释放调用该函数的线程将挂起等待, 等到线程结束且所占用的资源也就释放了。直到id为 thread 的线程终止。
    thread 线程以不同的方法终止,通过 pthread_join 得到的终止状态是不同的,总结如下:

    1. 如果 thread 线程通过 return 返回, value_ptr 所指向的单元里存放的是 thread 线程函数的返回值。
    2. 如果 thread 线程被别的线程调用 pthread_cancel 异常终止掉, value_ptr 所指向的单元里存放的是常数 PTHREAD_CANCELED
    3. 如果 thread 线程是自己调用 pthread_exit 终止的, value_ptr 所指向的单元存放的是传给 pthread_exit 的参数。
    4. 如果对 thread 线程的终止状态不感兴趣,可以传 NULL 给 value_ptr 参数。
    • 被动终止
      个线程可以调用 pthread_cancel 终止同一进程中的另一个线程

    • 综合示例程序

    #include<stdio.h>
    #include<pthread.h>
    #include<stdlib.h>
    #include<unistd.h>
    typedef struct
    {
        int var1;
        int var2;
    }Arg;
    
    void *th_fn1(void *arg)
    {
    	printf("thread 1 returning\n");
    	return (void *)1;
    }
    void *th_fn2(void *arg)
    {
    	printf("thread 2 returning\n");
    	pthread_exit((void *)2);
    }
    void *th_fn3(void *arg)
    {
    	while(1)
    	{
    		printf("thread 3 writing\n");
    		sleep(1);
    	}
    }
    void *th_fn4(void *arg)
    {
        Arg *r=(Arg *)arg;
       
    	printf("thread 1 returning\n");
    	return (void *)r;              //强转
    }
    
    int main(void)
    {
    	pthread_t tid;
    	void *tret;
       Arg r={10,20};
       
    	pthread_create(&tid,NULL,th_fn1,NULL);
    	pthread_join(tid,&tret);
        printf("thread 1 exit code %d\n",(int)tret);
    
    	pthread_create(&tid,NULL,th_fn2,NULL);
    	pthread_join(tid,&tret);
       printf("thread 2 exit code %d\n",(int)tret);   //细节   指针输出printf("%d\n",tret);即可输出tret地址存放的值
    
    	pthread_create(&tid,NULL,th_fn3,NULL);
    	sleep(3);
    	pthread_cancel(tid);
    	pthread_join(tid,&tret);
    	printf("thread 3 exit code %d\n",(int)tret);
     //当执行函数返回自定义指针(arg)时的情况
        thread_create(&tid,NULL,th_fn4,(void *)&r);  //细节传自定义数组
    	pthread_join(tid,(void **)&tret);
        printf("thread 4 exit code %d\n",((Arg *)tret)->var1+((Arg*)tret)->var2);  //强转
    	return 0;
    }
    
    • 运行情况
    thread 1 returning
    thread 1 exit code 1
    thread 2 returning
    thread 2 exit code 2
    thread 3 writing
    thread 3 writing
    thread 3 writing
    thread 3 exit code -1
    thread 1 returning
    thread 4 exit code 30
    
    
    
    展开全文
  • Linux线程-终止

    2019-10-01 16:24:05
    在前文讨论了线程创建的一些基本东西,这里讨论有哪些方法可以使线程终止线程终止又是如何与创建所需的参数进行关联的。 一,正常终止 线程在执行完成之后,正常终止。 二,线程取消 2.1 线程取消的定义 一般...

    在前文讨论了线程创建的一些基本东西,这里讨论有哪些方法可以使线程终止,线程终止又是如何与创建所需的参数进行关联的。

    一,正常终止

        线程在执行完成之后,正常终止。

    二,线程取消

    2.1 线程取消的定义
        一般情况下,线程在其主体函数退出的时候会自动终止,但同时也可以因为接收到另一个线程发来的终止(取消)请求而强制终止。

    2.2 线程取消的语义
        线程取消的方法是向目标线程发Cancel信号,但如何处理Cancel信号则由目标线程自己决定,或者忽略、或者立即终止、或者继续运行至Cancelation-point(取消点),由不同的Cancelation状态决定。线程接收到CANCEL信号的缺省处理(即pthread_create()创建线程的缺省状态)是继续运行至取消点,也就是说设置一个CANCELED状态,线程继续运行,只有运行至Cancelation-point的时候才会退出。

    2.3 取消点
         根据POSIX标准,pthread_join()、pthread_testcancel()、pthread_cond_wait()、 pthread_cond_timedwait()、sem_wait()、sigwait()等函数以及read()、write()等会引起阻塞的系统调用都是Cancelation-point,而其他pthread函数都不会引起Cancelation动作。但是pthread_cancel的手册页声称,由于LinuxThread库与C库结合得不好,因而目前C库函数都不是Cancelation-point;但CANCEL信号会使线程从阻塞的系统调用中退出,并置EINTR错误码,因此可以在需要作为Cancelation-point的系统调用前后调用 pthread_testcancel(),从而达到POSIX标准所要求的目标,即如下代码段:

     

    1. <span style="font-size:18px;">pthread_testcancel();  
    2. retcode = read(fd, buffer, length);  
    3. pthread_testcancel();</span>  


     

    2.4 程序设计方面的考虑
        如果线程处于无限循环中,且循环体内没有执行至取消点的必然路径,则线程无法由外部其他线程的取消请求而终止。因此在这样的循环体的必经路径上应该加入pthread_testcancel()调用。

    2.5 与线程取消相关的pthread函数
    int pthread_cancel(pthread_t thread)
    发送终止信号给thread线程,如果成功则返回0,否则为非0值。发送成功并不意味着thread会终止。
    int pthread_setcancelstate(int state, int *oldstate)
    设置本线程对Cancel信号的反应,state有两种值:PTHREAD_CANCEL_ENABLE(缺省)和 PTHREAD_CANCEL_DISABLE,分别表示收到信号后设为CANCLED状态和忽略CANCEL信号继续运行;old_state如果不为 NULL则存入原来的Cancel状态以便恢复。
    int pthread_setcanceltype(int type, int *oldtype)
    设置本线程取消动作的执行时机,type由两种取值:PTHREAD_CANCEL_DEFFERED和 PTHREAD_CANCEL_ASYCHRONOUS,仅当Cancel状态为Enable时有效,分别表示收到信号后继续运行至下一个取消点再退出和立即执行取消动作(退出);oldtype如果不为NULL则存入运来的取消动作类型值。
    void pthread_testcancel(void)
    检查本线程是否处于Canceld状态,如果是,则进行取消动作,否则直接返回。

    三,pthread_exit

        在线程内显示的调用,以终止线程。

    四,等待终止

        在一个线程里面,我们要等待另一个线程结束。可以通过调用pthread_join函数。

     

    1. <span style="font-size:18px;">pthread_join (pthread_t threadvoid** threadreturn);</span>  


       这将会在调用线程引起阻塞,并且在创建thread所指定的线程时,其分离属性必须是pthread_create_joinable.否则调用出错。

    转载于:https://www.cnblogs.com/xiatian1071/p/3640303.html

    展开全文
  • 下面小编就为大家带来一篇Linux多线程环境下 关于进程线程终止函数总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • https://blog.csdn.net/whatday/article/details/104376812?utm_medium=distribute.wap_relevant.none-task-blog-title-14

    https://blog.csdn.net/whatday/article/details/104376812?utm_medium=distribute.wap_relevant.none-task-blog-title-14

    展开全文
  • 一、主动终止 线程的执行函数中调用return语句 调用pthread_exit() 二、被动终止 1、线程可以被同一进程...2、线程终止的3种方式 #include int pthread_cancel(pthread_t tid); void pthread_exit(void *retval); i
  • Linux线程创建与终止

    2020-05-13 17:43:43
    线程概念 线程指程序的一个执行流,也可理解为是进程内部的一个控制序列,任何进程都至少含有一个线程。如下图所示: 在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么, 只是维护...
  • 如果进程中的任意一个线程调用了exit,_Exit,_exit,那么整个进程就会终止 二、不终止进程的退出方式 普通的单个线程有一下3中方式退出,这样不会终止进程 (1)从启动例程中返回,返回值是线程的退出码 (2)线程...
  • Linux:线程&线程创建&线程终止

    千次阅读 2018-04-08 23:55:34
    线程 1.是操作系统能够进行调度的最小单位 2.线程被包含在进程之中,是进程中的实际运作单位 3.一个线程指的是进程中一个单一顺序的控制流 4.一个进程可以并发多个线程,每个线程执行不同的任务 比如四...
  • 下面小编就为大家带来一篇linux线程的取消(终止)方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 如果需要只终⽌某个线程⽽不终⽌整个进程,可以有三种⽅法: 1. 从线程函数return。这种⽅法对主线程不适⽤,从main函数return相当于调⽤exit。 #include &lt;stdio.h&gt; #include&lt;unistd.h&gt...

空空如也

1 2 3 4 5 ... 20
收藏数 940
精华内容 376
关键字:

linux线程终止

linux 订阅