線程的終止和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:分離線程意味着通知系統不再需要此線程,允許系統將分配給它的資源回收。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM