《linux下线程的同步和互斥》由会员分享,可在线阅读,更多相关《linux下线程的同步和互斥(15页珍藏版)》请在金锄头文库上搜索。
1、Linux下线程的同步和互斥,mutex,Mutex:互斥设备(MUTual Exclusion device) 快速(fast) mutex 递归(recursive) mutex:获得锁的线程可以多次加锁 错误检测(error checking)mutex:锁定时返回错误,mutex相关函数,int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex
2、_trylock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex); int pthread_mutex_destroy(pthread_mutex_t *mutex);,锁定互斥锁,int pthread_mutex_lock(pthread_mutex_t *mutex); 在成功完成之后会返回零。其他任何返回值都表示出现了错误。 当返回时,该互斥锁已被锁定。调用线程是该互斥锁的属主。 互斥锁类型为快速锁:如果该互斥锁已被另一个线程锁定和拥有,则调用线程将阻塞,直到该互斥锁变为可用为止。 互斥
3、锁类型为错误锁:则会提供错误检查。如果某个线程尝试重新锁定的互斥锁已经由该线程锁定,则将返回错误。如果某个线程尝试解除锁定的互斥锁不是由该线程锁定或者未锁定,则将返回错误。 互斥锁类型为 递归锁:则该互斥锁会保留锁定计数这一概念。线程首次成功获取互斥锁时,锁定计数会设置为 1。线程每重新锁定该互斥锁一次,锁定计数就增加 1。线程每解除锁定该互斥锁一次,锁定计数就减小 1。 锁定计数达到 0 时,该互斥锁即可供其他线程获取。如果某个线程尝试解除锁定的互斥锁不是由该线程锁定或者未锁定,则将返回错误。,解除锁定互斥锁,int pthread_mutex_unlock(pthread_mutex_t
4、*mutex); 释放 引用的互斥锁对象。互斥锁的释放方式取决于互斥锁的类型属性。 在成功完成之后会返回零。其他任何返回值都表示出现了错误 。,使用MUTEX的简单代码,pthread_mutex_t mylock; mylock= PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(,Mutex例子,#include #include #include #include #define THREAD_NUMBER 10 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; int sum =
5、0; void* inc(void *arg) int i =(*(int *)arg); pthread_mutex_lock( ,Mutex例子(续),int main(int argc, char *argv) pthread_t ptTHREAD_NUMBER; int i; int argTHREAD_NUMBER; for(i=0; iTHREAD_NUMBER; i+) argi=i; if(pthread_create( ,Mutex例子(续),for(i=0; iTHREAD_NUMBER; i+) if(pthread_join(pti,NULL)!=0) printf(“
6、pthread_join errorn“); exit(1); printf(“sum is %dn“,sum); pthread_mutex_destroy( ,条件变量,可以使得一个线程在执行过程中,因满足某个条件而发出信号通知另一个线程。 而另一个线程可以处于挂起状态,等待某个条件的满足后,才继续执行 。 条件变量必须和mutex一起使用来避免竞争。,条件变量相关的操作函数,pthread_cond_t cond = PTHREAD_COND_INITIALIZER; int pthread_cond_init(pthread_cond_t *cond, pthread_condattr
7、_t *cond_attr); int pthread_cond_signal(pthread_cond_t *cond); int pthread_cond_broadcast(pthread_cond_t *cond); 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); int pthread
8、_cond_destroy(pthread_cond_t *cond); 在成功完成之后会返回零。其他任何返回值都表示出现了错误。,例子1,#include #include #include #include #define THREAD_NUMBER 2 static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void* thread1(void *arg) pthread_mutex_lock( ,例子1(续),void
9、* thread2(void *arg) int i = 0; struct timeval old, new; gettimeofday( ,例子1(续),int main(int argc, char *argv) int i; int ret_val; pthread_t ptTHREAD_NUMBER; ret_val = pthread_create( ,例子1(续),for (i = 0; i THREAD_NUMBER; i+) ret_val = pthread_join(pti, NULL); if (ret_val != 0) printf(“pthread_join error!n“); exit(1); pthread_mutex_destroy( ,