linux下线程的同步和互斥

上传人:今*** 文档编号:106910587 上传时间:2019-10-16 格式:PPT 页数:15 大小:147.50KB
返回 下载 相关 举报
linux下线程的同步和互斥_第1页
第1页 / 共15页
linux下线程的同步和互斥_第2页
第2页 / 共15页
linux下线程的同步和互斥_第3页
第3页 / 共15页
linux下线程的同步和互斥_第4页
第4页 / 共15页
linux下线程的同步和互斥_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《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( ,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号