Linux多线程

线程的创建和退出

1
2
3
4
5
6
7
8
9
#include<pthread.h>
int pthread_create(pthread_t* thread,pthread_attr_t* attr,void *(*start_routine)(void *),void* arg);
void pthread_exit(void *retval);
//通常形式
pthread_t pthid;
pthread_create(&pthid,NULL,pthfunc,NULL);
thread_create(&pthid,NULL,pthfunc,(void*)3);
pthread_exit(NULL);
pthread_exit((void*)3);
  • thread是传入参数,保存新进程的标识

  • attr是一个结构体指针,可用pthread_attr_init初始化,一般为NULL

  • start_routine是一个函数指针,指向新线程入口点函数,线程入口点函数带有一个void*的参数由pthread_create的第4个参数传入

  • arg用于传递给第三个参数指向的入口点函数的参数,可以为NULL,表示不传递 # 线程的等待退出

    1
    2
    3
    4
    #include<pthread.h>
    int pthread_join(pthread_t th,void **thread_return)
    //thread_return是一个传出参数,接收线程的返回值
    //若前程使用pthread_exit()终止,该函数内参数则为返回值
    # 线程的取消

    int pthread_cancel(pthread_t thread);

根据POSIX标准,pthread_join(),pthread_testcancel(),pthread_cond_wait(),pthread_cond_timedwait(),sem_wait(),sigwait(),read(),write()等会相应cancel信号

进程终止清理函数

1
2
3
4
void pthread_cleanup_push(void(*v)
void pthread_clean_pop(int execute);
//execute参数为非0时,则按栈的顺序注销一个注册的清理函数
//并执行该函数,参数为0时,仅调用cancel函数指针和exit时执行清理函数

线程的同步和互斥

互斥

1
2
3
4
#include<pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *mute);
//其中muteattr用于指定互斥锁
pthread_mutex_destroy();//用于注销一个互斥锁

//互斥锁属性

1
2
3
typedef struct{
int __mutexkind;
};
1
2
3
int pthread_mutex_lock(pthread_mutex_t *mutex);//加锁
int pthread_mutex_unlock(pthread_mutex_t *mutex);//解锁
int pthread_mutex_trylock(pthread_mutex_t *mutex);//测试加锁
## 同步

1
2
3
4
5
6
7
8
9
10
#include<pthread.h>
int pthread_cond_init(pthread_cond_t *cond,const pthread_condattr_t *cond_attr);
//cond_attr没有实现,NULL
int pthread_cond_destroy();//用于注销一个互斥锁
int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t * mutex);
int pthread_cond_timedwait(pthread_cond_t *cond,pthread_mutex_t * mutex,const struct timespec *abstime);
pthread_cond_signal();
//按入队顺序激活其中一个
pthread_cond_broadcats();
//激活所有等待线程