POSIX线程:
一个完成的线程/进程包括三部分,代码+数据+内存栈;子线程和子进程在被创建的时候,
对于fork()创建子进程,三部分都要复制一份,数据包括比如文件描述符,虚拟内存,子进程关闭文件描述符不会影响父进程中的描述符;
对于pthread_create()创建子线程的时候,只有内存栈被复制,其他的部分(代码,数据都是共享的),如果一个线程改变了某变量的值,其他所有的线程都调用的是改变之后的值;
头文件#include <pthread.h>
编译参数: -lpthread
(一)涉及到的类型:
pthread_t, pthread_attr_t, pthread_cond_t, pthread_mutexattr_t, void* (*)(void*),
(二)涉及到的函数:
pthread_cancel,pthread_wait,
pthread_create, pthread_self, pthread_detach, pthread_join, pthread_exit,
pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_unlock, pthread_mutex_destory; //参数都是pthread_mutex_t*
int pthread_attr_init(pthread_attr_t*), int pthread_attr_destory(pthread_attr_t*),
int pthread_attr_setdetachstatus(pthread_attr_t*,int); //设置属性
int pthread_attr_getdetacstatus(const pthread_attr_t*, int*); //获取属性
pthread_cond_wait,pthread_cond_timewait,pthread_cond_signal,pthread_cond_broadcast,pthread_cond_destory;
1.设置线程属性:
一个线程属性对象,(例如pthread_attr_t attr_test),可以创建很多线程,创建线程之后没有必要保持此对象;
在线程的所有属性中,最重要的是分离属性(detach status),一个线程可以是等待线程(joinable thread)or分离线程(detach thread),默认是joinable thread;
对于一个非分离(joinable)线程, 类似于进程中的Zombies进程,joinbale thread在退出后,资源不会被立刻释放,直到被thread_join获取它的返回值;
对于一个分离(detach)线程在退出之后, 资源会被立刻释放, 其他线程无法获悉其返回值;
代码例子,main线程中:
pthread_attr_t attr; //(1)创建变量:
phtread_attr_init(&attr); //(2)初始化此属性变量;
pthread_setdetachstatus(&attr,PTHREAD_CREATED_DETACHED);//(3)
pthread_create(&t,&attr,&function,NULL);//(4)创建线程;
pthread_destory(&attr);//(5)创建完后,即可销毁此属性变量;
pthread_join(t,NULL); //错误!分离的线程无法被join
return; //main线程结束
2.创建线程:
int pthread_create(pthread *thread, pthread_attr_t *attr, void* (*start_routine)(*void), void* arg);
其中pthread_attr_t*和void* arg可设置为NULL;