线程的终止和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\n");
    }
    status = pthread_join(thread_id, &thread_result);
    if (status != 0)
    {
        perror("join pthread \n");
    }

    printf("status is %d thread_result is %p\n", 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:分离线程意味着通知系统不再需要此线程,允许系统将分配给它的资源回收。

猜你喜欢

转载自www.cnblogs.com/nowroot/p/12635130.html