首页 > 代码库 > thread_19
thread_19
#include <stdlib.h>#include <pthread.h>#include <stdio.h>#include <sched.h>pthread_mutex_t mu;void *consumer1(void *p){ if(!pthread_mutex_lock(&mu)) printf("get mutex(1)\n"); else return NULL; pthread_mutex_unlock(&mu); } void *consumer2(void *p) { if(!pthread_mutex_lock(&mu)) printf("get mutex(2)\n"); else return NULL; pthread_mutex_unlock(&mu);}int main(int argc, char *argv[]) { pthread_t t1, t2, t3; int ret; pthread_mutexattr_t mutexattr; pthread_mutexattr_init(&mutexattr); pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_RECURSIVE_NP); pthread_mutex_init(&mu, &mutexattr); if(!pthread_mutex_lock(&mu)) printf("get mutex (mian)\n"); if(!pthread_mutex_lock(&mu)) printf("get mutex (main)\n"); pthread_mutex_unlock(&mu); pthread_mutex_unlock(&mu); ret = pthread_create(&t1, NULL, consumer1, NULL); ret = pthread_create(&t2, NULL, consumer2,NULL); if(ret != 0) { printf("create failed,%d\n", ret); exit(1); } sleep(2); printf("main returned\n"); return 0; }/*如果将39行注释掉,子线程将得不到锁。加几次锁就要解几次锁,而其要在同一个线程进行。如果解锁次数多于加锁次数,效果和相等一样。2. 互斥锁属性互斥锁的属性在创建锁的时候指定,在LinuxThreads实现中仅有一个锁类型属性,不同的锁类型在试图对一个已经被锁定的互斥锁加锁时表现不同。当前(glibc2.2.3,linuxthreads0.9)有4个值可供选择:* PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。这种锁策略保证了资源分配的公平性。* PTHREAD_MUTEX_RECURSIVE_NP,嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果是不同线程请求,则在加锁线程解锁时重新竞争。* PTHREAD_MUTEX_ERRORCHECK_NP,检错锁,如果同一个线程请求同一个锁,则返回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP类型动作相同。这样就保证当不允许多次加锁时不会出现最简单情况下的死锁。* PTHREAD_MUTEX_ADAPTIVE_NP,适应锁,动作最简单的锁类型,仅等待解锁后重新竞争。*/
thread_19
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。