线程的三种同步机制

来源:互联网 发布:php图片验证码源码 编辑:程序博客网 时间:2024/05/01 08:23

线程的三种同步机制:

互斥:

变量名为:

pthread_mutex_t

初始化与销毁:


如果是静态分配的互斥量,可以设置为常量 PTHREAD_MUTEX_INITIALIZER

如果是动态分配的互斥量,则在销毁内存之前要调用pthread_mutex_destroy


int pthread_mutex_init(pthread_mutex_t *, NULL);

第二个参数null表示选择默认设置。

int pthread_mutex_destroy(pthread_mutex_t* mutex);

函数成功返回0, 否则返回错误编号。


上锁与解锁:

int pthread_mutex_lock(pthread_mutex_t* );

int pthread_mutex_unlock(pthread_mutex_t*);

int pthread_mutex_trylock(pthread_mutex_t*);

第三个函数有点特殊,它尝试对互斥量加锁,如果不成功,返回EBUSY, 线程不会阻塞。


书上的代码是错的。。。囧


读写锁

又叫共享-独占锁。读写锁适用与对数据的读取大于写入的场合。读写锁允许同时有多个线程读取数据,但只能有一个线程写入数据。

当读写锁处于读模式锁住时,如果有线程试图以写模式加锁,则读写锁会阻塞随后的读模式锁请求

变量:

pthread_rwlock_t


初始化与销毁:

int pthread_rwlock_init(pthread_rwlock_t *);

int pthread_rwlock_destroy(pthread_rwlock_t *);


加锁与解锁:

int pthread_rwlock_rdlock(pthread_rwlock_t *);

int pthread_rwlock_wrlock(pthread_rwlock_t *);

int pthread_rwlock_unlock(pthread_unlock);

读写模式的加锁请求调用不同的函数,解锁调用相同的函数。

在读模式下,解锁时对引用计数减一,如果减到0,则解锁

在写模式下,解锁时饮用计数会减到0,所以直接解锁

因此不用区分两种解锁方式,用相同的函数即可。


同样有try版本:

int pthread_rwlock_tryrdlock(pthread_rwlock_t *);

int pthread_rwlock_trywrlock(pthread_rwlock_t*);


条件变量:
条件变量需要与互斥量配合使用。

条件变量等待某个条件的发生,而互斥量用于锁住线程进入和推出队列的时间空隙,使得条件变量不会错过条件的变化。

变量名:

pthread_cond_t


初始化与销毁:

静态初始化变量: PTHREAD_COND_INITIALIZER

int pthread_cond_init(pthread_cond_t * , NULL);

int pthread_cond_destroy(pthread_cond_t*);


wait:

int pthread_cond_wait(pthread_cond_t *, pthread_mutex_t*);

int pthread_cont_timedwait(pthread_cond_t*, pthread_mutex_t*, timespec* timeout);

第二个函数多了设置等待时间的参数


在使用wait函数时, 首先要对 mutex加锁。

然后调用wait函数。 wait函数会先将线程放到等待队列上,然后将mutex解锁。

如果在等待时间内,没有等到条件发生,wait函数会先对mutex加锁,再将线程推出等待队列。


通知函数:
int pthread_cond_signal (pthread_cond_t *cond);

int pthread_cond_broadcast(pthread_cond_t* cond);



原创粉丝点击