进程:程序的调度单位,程序的运行
线程:多道执行路径,拥有独立的栈空间
1.创建:
int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routline)(void *), void *arg);
thread:线程的标志符
attr:线程属性,可以设置为NULL
start_routine:线程的入口函数
arg:传递给start_routine所指函数的参数
2.退出:
void pthread_exit(void *retval);
3.等待:
int pthread_join(pthread_t th, void **thread_return);
4.线程的取消:
一个线程向另外一个线程发送cancel信号,如何处理由目标线程确定,可以忽略、终止、或继续运行至cancel-point后终止。
int pthread_cancel(pthread_t thread);
5.线程清理
线程被外界取消或者发生中断,临界资源处于锁定状态。
从pthread_cleanup_push()和pthread_cleanup_pop()之间的程序段中的终止动作都将执行pthread_cleanup_push()所指定的清理函数;
void pthread_cleanup_push(void (*routine)(void *), void *arg);
void pthread_cleanup_pop(int execute);
这是以宏的方式定义的,需在同级代码中成对出现。
pthread_cleanup_pop()的参数execute如果是非0,则按栈顺序注销清理函数;如果为0,则在线程调用pthread_exit或者其他线程对本线程pthread_cancel时,
执行清理函数。
6.posix无名信号量
int sem_init(sem_t *sem, int pshared, unsigned int value);
value:
pshared:0,在线程中用posix的无名信号量
int sem_destroy(sem_t *sem);
返回值为-1表示有线程在等待该信号量
int sem_post(sem_t *sem);
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);//如果信号量大于0,则原子减一,否则返回-1,errno置为EAGAIN;
//信号量的值保存到sval中
int sem_getvalue(sem_t *sem, int *sval);
7锁:实现资源一个时候只能有一个访问。
7.1创建
静态方式:
pthread_mutex_t mutex=PTHREAD_MUTEXT_INITIALIZER;
动态方式:
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
7.2销毁
int pthread_mutex_destroy(pthread_mutex_t *mutex);
7.3锁的属性
typedef struct
{
int __mutextkind;
}pthread_mutexattr_t;
PTHREAD_MUTEX_TIMED_NP 快速锁
PTHREAD_MUTEXT_RECURSIVE_NP 嵌套锁,同一个线程可以获得多次,通过unlock解锁多次
PTHREAD_MUTEXT_ERRORCHECK_NP 检错锁
7.4锁的操作
加锁:
int pthread_mutex_lock(pthread_mutex_t *mutex);
解锁:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
测试加锁:
int pthread_mutex_trylock(pthread_mutex_t *mutex);
锁被占据时返回EBUSY
:使用中要用清理函数释放锁
8.条件变量
8.1创建和注销
静态方式:
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
动态方式:
int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);
cond_attr:属性,置NULL
注销:
int pthread_cond_destroy(pthread_cond_t *cond);
8.2等待
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);
线程解开mutex指向的锁并被条件变量cond阻塞。如果有abstime,则经历abstime时间后阻塞自动解除。
mutex互斥锁必须是普通锁;
过程:
A:本线程加锁pthread_mutex_lock();
B:调用pthread_cond_wait()函数,这个函数会自动解锁,将本线程挂起
C:等到被pthread_cond_signal激发,锁恢复到锁定状态
D:最后要解锁pthread_mutex_unlock();
激活
int pthread_cond_signal(pthread_cond_t *cond);//激活队列中的一个
int pthread_cond_broadcast(pthread_cond_t *cond);//所有的都激活
用到锁,要使用清理函数
条件变量着重在等待,而无名信号(信号灯)着重在告诉资源可用
阅读(800) | 评论(0) | 转发(0) |