线程的终止和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:分离线程意味着通知系统不再需要此线程,允许系统将分配给它的资源回收。
一勤天下无难事。