zoukankan      html  css  js  c++  java
  • 线程的终止和pthread_join的理解

    #include "stdafx.h"
    #include <pthread.h>
    #include <stdio.h>
    
    void * thread_routine(void*arg);
    void * thread_routine(void*arg)
    {
        return arg;
    }
    int main(int argc, _TCHAR  *argv[])
    {
    
        pthread_t thread_id;
        void *thread_result;
        int status;
        pthread_attr_t attr;
        pthread_attr_init(&attr);
        pthread_attr_setscope(&attr, PTHREAD_SCOPE_PROCESS);
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); // 这个属性说明了线程是如何结束的
        // PTHREAD_CREATE_JOINABLE 同步结束    需要pthread_join 
        // PTHREAD_CREATE_DETACHED 异步结束    pthread_join没有作用
        status = pthread_create(&thread_id, &attr, thread_routine, NULL);
        if (status != 0)
        {
            perror("pthread_create eror
    ");
        }
        status = pthread_join(thread_id, &thread_result);
        if (status != 0)
        {
            perror("join pthread 
    ");
        }
    
        printf("status is %d thread_result is %p
    ", status,thread_result);
    
        if (thread_result == NULL)
        {
            while (1);
            return 0;
        }
        else
        {
            while (1);
            return 1;
        }
    
    
        while (1);
    }

    大佬说 : fork 和 join 一对词     

    pthread_join : wait意思  等待资源 被释放    还有一个好处就是被等待的线程应该将返回值或任何其他信息保存在某个公共位置,并将条件变量广播给所有在其上等待的线程

    以唤醒他们。

    enum {
    /*
     * pthread_attr_{get,set}detachstate
     */
      PTHREAD_CREATE_JOINABLE       = 0,  /* Default */
      PTHREAD_CREATE_DETACHED       = 1,
    
    /*
     * pthread_attr_{get,set}inheritsched
     */
      PTHREAD_INHERIT_SCHED         = 0,
      PTHREAD_EXPLICIT_SCHED        = 1,  /* Default */
    
    /*
     * pthread_{get,set}scope
     */
      PTHREAD_SCOPE_PROCESS         = 0,
      PTHREAD_SCOPE_SYSTEM          = 1,  /* Default */
    
    /*
     * pthread_setcancelstate paramters
     */
      PTHREAD_CANCEL_ENABLE         = 0,  /* Default */
      PTHREAD_CANCEL_DISABLE        = 1,
    
    /*
     * pthread_setcanceltype parameters
     */
      PTHREAD_CANCEL_ASYNCHRONOUS   = 0,
      PTHREAD_CANCEL_DEFERRED       = 1,  /* Default */
    
    /*
     * pthread_mutexattr_{get,set}pshared
     * pthread_condattr_{get,set}pshared
     */
      PTHREAD_PROCESS_PRIVATE       = 0,
      PTHREAD_PROCESS_SHARED        = 1,
    
    /*
     * pthread_barrier_wait
     */
      PTHREAD_BARRIER_SERIAL_THREAD = -1
    };

    PTHREAD_CREATE_JOINABLE: 一个没有被分离的线程终止时会保留其虚拟内存,包括他们的堆栈和其他系统资源。

    PTHREAD_CREATE_DETACHED:分离线程意味着通知系统不再需要此线程,允许系统将分配给它的资源回收。

    一勤天下无难事。
  • 相关阅读:
    悄摸直播(一)—— 推流器的实现(获取笔记本摄像头画面,转流推流到rtmp服务器)
    MySQL知识-MySQL同版本多实例的配置
    Jumpserver-跳板机的搭建
    搭建本地的yum仓库-较简单
    监控-zabbix
    Git-Jenkins-代码的上线
    ELK-日志管理平台
    简单的认识Linux
    工作碰上的技术问题及处理经验(三)
    oracle数据库应用开发经验
  • 原文地址:https://www.cnblogs.com/nowroot/p/12635130.html
Copyright © 2011-2022 走看看