虽然线程在进程内部共享地址空间, 打开文件描述符等资源,但是线程也有其私有数据,例如
线程号(唯一ID) , 寄存器, 堆栈, 信号掩码, 优先级, 线程私有的存储空间
linux支持POSIX多线程接口, 编写linux下的多线程应用程序, 需要使用头文件 pthread.h , 链接时需要使用库lipthread.a
线程创建函数:
int pthread_create (pthread_t *thread, pthread_attr_t *attr, void *(start_routine)(void *), void *arg)
~thread :指针, 当线程创建成功时, 用来返回创建的线程ID
~attr : 指定线程属性, NULL 表示默认属性,,,是一个指向pthread attr结构体的指针.
~start_routine : 函数指针, 指向线程创建后要调用的函数, 这个被线程调用的也称作线程函数.
~arg : 该参数指向传递给线程函数的参数
创建成功返回0, 不成功返回错误码.错误原因有 线程数目过多或第二个参数线程属性非法
线程创建成功后,新创建的线程开始运行第三个参数所指向的函数,原来的线程继续运行
线程终止主要要资源释放,否则形成死锁,后果严重.
自动释放资源函数:pthread_cleanup_push(), pthread_cleanup_pop(),,,两个函数都是以宏的形式提供的,,他两必须成对出现,且笔粗位于同一代码段.
等待函数
void pthread_exit(void *retval);
int pathread_join(pthread_t th, void *thread_return );
int pthread_detach(pthread_t th);l
函数join用来等待一个线程的结束,调用者将被挂起并等待 th 线程终止,如果thread_return 不为NULL, 则*thread_return = retval
一个可join 的线程所占用的内存仅当有线程对其执行了pthread_join()后才会释放, 因此为了避免内存泄露,所有线程终止时,要么已被设为DETACHED , 要么使用函数来回收资源.
一个线程只能被一个线程等待,若有多个, 则第一个接收到信号的成功返回,剩下返回错误代码
加锁有两个函数:
pthread_mutexlock 和 pthread_mutex_trylock
lock 加锁时,如果已锁则阻塞等待,当lock返回时,说明函数已经为当前进程枷锁成功.
trylock当遇到已加锁时立即返回, 返回错误代码
解锁: pthread_mutex_unlock(pthread_mutex_t *mutex);
清锁: pthread_mutex_destroy(pthread_mutex *mutex);