Apue学习:线程

线程标识

#include <pthread.h>
int pthread_equal(pthread_t tid1, pthread_t tid2);

pthread_t pthread_self(void);

线程创建

#include <pthread.h>

int phread_create(pthread_t *restrict tidp,
                  const pthread_attr_t *restrict attr,
                  void *(*start_rtn)(void *),
                  void *restrict arg);
                  //成功返回0,出错返回错误编码

phtread_create成功之后,tidp就被设置为线程id,attr是线程的属性,start_rtn是线程开始执行的地方,但是start_rtn只能有一个void *类型的参数,要想有其他参数,可以把这个参数放到一个结构体中,然后把这个结构的地址作为arg参数传入。

线程终止

线程可以通过三种方式退出:
1)线程从启动例程返回,返回值是线程的退出码
2)线程可以被同一进程的其他线程取消
3)线程调用pthread_exit函数

#include <pthread.h>
void pthread_exit(void *rval_ptr);

int pthread_join(pthread_t thread, void **rval_ptr);

pthread_join中的rval_ptr就是可以获得pthread_exit中的rval_ptr的。调用pthread_join的线程会一直阻塞,直到指定的线程调用pthread_exit,从启动例程中返回或者被取消。
注意pthread_join中的rval_ptr指向的是什么,对于调用pthread_exit函数的线程,rval_ptr指向的是rval_ptr中的内容;对于从启动例程中返回的线程,rval_ptr指向的是从启动例程返回的那个void *指向的内容。

线程同步

1.互斥量

#include <pthread.h>
int pthread_mutex_init(pthread *restrict mutex,
                       const pthread_mutexattr_t *restrict attr);

int pthread_mutex_destroy(phtread_mutex_t *mutex);

int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int phtread_mutex_unlock(pthread_mutex_t *mutex);

2.避免死锁
3.读写锁
4.条件变量

#include <pthread.h>
int pthread_cond_init(pthread_cond_t *restrict cond,
                      pthread_condattr_t *restrict attr);

int pthread_cond_destroy(pthread_cond_t *cond);

int pthread_cond_wait(pthread_cont_t *restrict cond,
                      pthread_mutex_t *restrict mutex,
                      const struct timespec *restrict timeout);

int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);

你可能感兴趣的:(Apue学习:线程)