pthread_mutex_lock

jiu__ jiu__     2022-08-14     248

关键词:

pthread_mutex_lock

pthread_mutex_lock(pthread_mutex_t *mutex);

int pthread_mutex_trylock(pthread_mutex_t *mutex);

int pthread_mutex_unlock(pthread_mutex_t *mutex);

     描述 pthread_mutex_lock()函数锁住由mutex指定的mutex 对象。如果mutex已经被锁住,调用这个函数的线程阻塞直到mutex可用为止。这跟函数返回的时候参数mutex指定的mutex对象变成锁住状态, 同时该函数的调用线程成为该mutex对象的拥有者。

     如果mutex 对象的type是 PTHREAD_MUTEX_NORMAL,不进行deadlock detection(死锁检测)。企图进行relock 这个mutex会导致deadlock. 如果一个线程对未加锁的或已经unlock的mutex对象进行unlock操作,结果是不未知的。

     如果mutex类型是 PTHREAD_MUTEX_ERRORCHECK,那么将进行错误检查。如果一个线程企图对一个已经锁住的mutex进行relock,将返回一个错 误。如果一个线程对未加锁的或已经unlock的mutex对象进行unlock操作,将返回一个错误。

     如果mutex类型是 PTHREAD_MUTEX_RECURSIVE,mutex会有一个锁住次数(lock count)的概念。当一个线程成功地第一次锁住一个mutex的时候,锁住次数(lock count)被设置为1,每一次一个线程unlock这个mutex的时候,锁住次数(lock count)就减1。当锁住次数(lock count)减少为0的时候,其他线程就能获得该mutex锁了。如果一个线程对未加锁的或已经unlock的mutex对象进行unlock操作,将返 回一个错误。

    如果mutex类型是 PTHREAD_MUTEX_DEFAULT,企图递归的获取这个mutex的锁的结果是不确定的。unlock一个不是被调用线程锁住的mutex的结 果也是不确定的。企图unlock一个未被锁住的mutex导致不确定的结果。

    pthread_mutex_trylock()调用在参数mutex指定的mutex对象当前被锁住的时候立即返回,除此之外,pthread_mutex_trylock()跟pthread_mutex_lock()功能完全一样。

    pthread_mutex_unlock()函数释放有参数mutex指定的mutex对象的锁。如果被释放取决于该Mutex对象的类型属性。如果有多个线程为了获得该mutex锁阻塞,调用pthread_mutex_unlock()将是该mutex可用,一定的调度策略将被用来决定哪个线程可以获得该mutex锁。(在mutex类型为PTHREAD_MUTEX_RECURSIVE 的情况下,只有当lock count 减为0并且调用线程在该mutex上已经没有锁的时候)(翻译到这里,才觉得我的这个锁概念是多么模糊) 如果一个线程在等待一个mutex锁得时候收到了一个signal,那么在从signal handler返回的时候,该线程继续等待该mutex锁,就像这个线程没有被中断一样。

    返回值成功

    pthread_mutex_lock() 和 pthread_mutex_unlock() 返回0,否则返回一个错误的提示码

    pthread_mutex_trylock() 在成功获得了一个mutex的锁后返回0,否则返回一个错误提示码错误

    pthread_mutex_lock() 和 pthread_mutex_unlock()失败的时候 [EINVAL] mutex在生成的时候,它的protocol属性的值是 PTHREAD_PRIO_PROTECT,同时调用线程的优先级(priority)比该mutex的当前prority上限高

pthread_mutex_trylock() 函数在一下情况会失败:

[EBUSY] The mutex could not be acquired because it was already locked. mutex已经被锁住的时候无法再获取锁

The pthread_mutex_lock(), pthread_mutex_trylock() and pthread_mutex_unlock() functions may fail if:

[EINVAL] mutex指向的mutex未被初始化

[EAGAIN] Mutex的lock count(锁数量)已经超过 递归索的最大值,无法再获得该mutex锁

pthread_mutex_lock() 函数在一下情况下会失败:

[EDEADLK] 当前线程已经获得该mutex锁

pthread_mutex_unlock() 函数在以下情况下会失败:

 [EPERM] 当前线程不是该mutex锁的拥有者 所有的这些函数的错误返回值都不会是[EINTR]

互斥锁

互斥锁用来保证一段时间内只有一个线程在执行一段代码。必要性显而易见:假设各个线程向同一个文件顺序写入数据,最后得到的结果一定是灾难性的。

我们先看下面一段代码。这是一个读/写程序,它们公用一个缓冲区,并且我们假定一个缓冲区只能保存一条信息。即缓冲区只有两个状态:有信息或没有信息。

void reader_function ( void );
void writer_function ( void );

char buffer;
int buffer_has_item=0;
pthread_mutex_t mutex;
struct timespec delay;
void main ( void ){
pthread_t reader;
/* 定义延迟时间*/
delay.tv_sec = 2;
delay.tv_nec = 0;
/* 用默认属性初始化一个互斥锁对象*/
pthread_mutex_init (&mutex,NULL);
pthread_create(&reader, pthread_attr_default, (void *)&reader_function), NULL);
writer_function( );
}

void writer_function (void){
while(1){
/* 锁定互斥锁*/
pthread_mutex_lock (&mutex);
if (buffer_has_item==0){
buffer=make_new_item( );
buffer_has_item=1;
}
/* 打开互斥锁*/
pthread_mutex_unlock(&mutex);
pthread_delay_np(&delay);
}
}

void reader_function(void){
while(1){
pthread_mutex_lock(&mutex);
if(buffer_has_item==1){
consume_item(buffer);
buffer_has_item=0;
}
pthread_mutex_unlock(&mutex);
pthread_delay_np(&delay);
}
}


这里声明了互斥锁变量mutex,结构pthread_mutex_t为不公开的数据类型,其中包含一个系统分配的属性对象。函数 pthread_mutex_init用来生成一个互斥锁。NULL参数表明使用默认属性。如果需要声明特定属性的互斥锁,须调用函数 pthread_mutexattr_init。函数pthread_mutexattr_setpshared和函数 pthread_mutexattr_settype用来设置互斥锁属性。前一个函数设置属性pshared,它有两个取 值,PTHREAD_PROCESS_PRIVATE和PTHREAD_PROCESS_SHARED。前者用来不同进程中的线程同步,后者用于同步本进 程的不同线程。在上面的例子中,我们使用的是默认属性PTHREAD_PROCESS_ PRIVATE。后者用来设置互斥锁类型,可选的类型有PTHREAD_MUTEX_NORMAL、PTHREAD_MUTEX_ERRORCHECK、 PTHREAD_MUTEX_RECURSIVE和PTHREAD _MUTEX_DEFAULT。它们分别定义了不同的上所、解锁机制,一般情况下,选用最后一个默认属性。

pthread_mutex_lock声明开始用互斥锁上锁,此后的代码直至调用pthread_mutex_unlock为止,均被上锁,即同一时间只 能被一个线程调用执行。当一个线程执行到pthread_mutex_lock处时,如果该锁此时被另一个线程使用,那此线程被阻塞,即程序将等待到另一 个线程释放此互斥锁。在上面的例子中,我们使用了pthread_delay_np函数,让线程睡眠一段时间,就是为了防止一个线程始终占据此函数。

上面的例子非常简单,就不再介绍了,需要提出的是在使用互斥锁的过程中很有可能会出现死锁:两个线程试图同时占用两个资源,并按不同的次序锁定相应的互 斥锁,例如两个线程都需要锁定互斥锁1和互斥锁2,a线程先锁定互斥锁1,b线程先锁定互斥锁2,这时就出现了死锁。此时我们可以使用函数 pthread_mutex_trylock,它是函数pthread_mutex_lock的非阻塞版本,当它发现死锁不可避免时,它会返回相应的信 息,程序员可以针对死锁做出相应的处理。另外不同的互斥锁类型对死锁的处理不一样,但最主要的还是要程序员自己在程序设计注意这一点。

 

from:http://blog.csdn.net/xiaopohaibebo/article/details/12646323

pthread_mutex_lock 导致死锁

】pthread_mutex_lock导致死锁【英文标题】:pthread_mutex_lockcausesdeadlock【发布时间】:2012-09-2023:07:22【问题描述】:我正在使用上面的代码使用2个线程来递增计数器,这些线程独立地获取mut锁和递增计数器。线程进入此函数后,我面... 查看详情

pthread_mutex_lock/unlock

我们来考察下pthread中锁的实现。首先看下初始化宏:PTHREAD_MUTEX_INITIALIZER。#definePTHREAD_MUTEX_INITIALIZER{{0,0,0,0,0,__PTHREAD_SPINS,{0,0}}}/*Datastructuresformutexhandling.Thestructureoftheattributetypeisnotexposedonpu 查看详情

pthread_mutex_lock源码分析(代码片段)

直接把注释写到代码中:1int2__pthread_mutex_lock(pthread_mutex_t*mutex)34unsignedinttype=PTHREAD_MUTEX_TYPE_ELISION(mutex);56//安全检查7LIBC_PROBE(mutex_entry,1,mutex);89//返回__pthread_mutex_lock_full10if(__builtin_e 查看详情

pthread_join 和 pthread_mutex_lock 有啥区别?

】pthread_join和pthread_mutex_lock有啥区别?【英文标题】:Whatsthedifferencebetweenpthread_joinandpthread_mutex_lock?pthread_join和pthread_mutex_lock有什么区别?【发布时间】:2015-10-0217:10:13【问题描述】:以下代码取自thissite,它展示了如何使用互... 查看详情

关于 pthread_mutex_lock 的一些问题

】关于pthread_mutex_lock的一些问题【英文标题】:somequestionsregardingpthread_mutex_lock【发布时间】:2010-06-2315:15:53【问题描述】:当线程1已经获得了互斥对象的锁,如果线程2试图获得同一个互斥对象的锁,线程2将被阻塞。这是我的... 查看详情

pthread_mutex_lock 是不是有happens-before语义

】pthread_mutex_lock是不是有happens-before语义【英文标题】:Doespthread_mutex_lockhavehappens-beforesemanticspthread_mutex_lock是否有happens-before语义【发布时间】:2015-07-2114:20:47【问题描述】:threadA通过这个sn-pglobal_a=100;//1pthread_mutex_lock(&b 查看详情

pthread_cond_wait 和 pthread_mutex_lock 优先级?

】pthread_cond_wait和pthread_mutex_lock优先级?【英文标题】:pthread_cond_waitandpthread_mutex_lockpriority?【发布时间】:2017-11-0823:04:14【问题描述】:我有多个读线程和一个写线程。如果我在其中一个读取线程上锁定互斥锁并从中发送广播... 查看详情

线程相关函数-pthread_mutex_lock(),pthread_mutex_unlock()互斥锁

互斥锁实例:#include<pthread.h>pthread_mutex_tmutex=PTHREAD_MUTEX_INITIALIZER;intpthread_mutex_destroy(pthread_mutex_t*mutex);intpthread_mutex_init(pthread_mutex_t*restrictmutex,constpthread_mutexattr 查看详情

多线程输出奇偶数

...HREAD_MUTEX_INITIALIZER;boolflag=false;inti=0;void*PrintA(void*arg)while(1)pthread_mutex_lock(&qlock);pthread_cond_wait(&qready,&qlock);cout<<"A="<<i<<endl;i++;pthread_mutex_unlock(&qlock);flag=false;if(i>=100)break;void*PrintB(void*arg)while(1)if(i>... 查看详情

多线程同步

概念:多个线程按照规定的顺序来执行,即为线程同步扫地5次后拖地模型#include<pthread.h>#include<stdio.h>pthread_mutex_tmut;pthread_tthread[2];intnumber=0;voidstudentA(){inti;for(i=0;i<5;i++){//扫地1次pthread_mutex_lock(& 查看详情

c语言程序设计实验报告

...sleep的数量可以调节读者和写者的速度,便于观察sleep(2);pthread_mutex_lock(&rmutex);//开始读if(rcount==0)pthread_mutex_lock(&wmutex);//判定是否在写rcount+=1;pthread_mutex_unlock(&rm 查看详情

linuxc语言多线程竞争(加锁解锁pthread_mutex_tpthread_mutex_lock()pthread_mutex_unlock()可解决)(代码片段)

...d_mutex_tmylock=PTHREAD_MUTEX_INITIALIZER;staticvoid*funcAdd(void*arg) pthread_mutex_lock(&mylock); count++; pthread_mutex_unlock(&mylock); sleep(1); pthread_mutex_lock(&mylock); count++; pthread_mutex_unlock(&mylock); sleep(1); pthread_mutex_lock(&mylock); co... 查看详情

线程池学习笔记

记录一下学习线程池的过程,代码用到的函数归结: pthread_mutex_lock pthread_mutex_unlock pthread_cond_wait pthread_cond_signal pthread_cond_broadcast pthread_create pthread_join 程序中还用到了 查看详情

linux下互斥锁mutex,貌似锁不上呢

...ck=PTHREAD_MUTEX_INITIALIZER;pthread_ttid1,tid2,tid3;void*thrd_1(void*arg) pthread_mutex_lock(&qlock); printf("thred_1..test1\n"); sleep(2); printf("thred_1...test2\n"); sleep(2); printf("thred_1..test3\n"); sleep(2); printf("thred_1..test4\n")... 查看详情

线程与信号,线程与锁

#include<stdio.h>#include<apue.h>#include<pthread.h>pthread_mutex_tnumber_mutex=PTHREAD_MUTEX_INITIALIZER;intglobvar=0;void*write_p(void*arg){while(1){pthread_mutex_lock(&number_ 查看详情

C++ Pthread 互斥锁

...是会锁定所有线程,直到mutex被解锁?例如:if(someBoolean)pthread_mutex_lock(&mut);someFunction();pthread_mu 查看详情

多线程 - 比单线程慢

...录并找到并打印所有名为X的文件。代码如下:while(!done)pthread_mutex_lock(&lock);if(!list_isEmpty 查看详情

互斥量示例/教程? [关闭]

...,其中锁定不起作用。互斥锁的一个绝对不直观的语法是pthread_mutex_lock(&amp;mutex1);,看起来互斥锁被锁定了,而我真 查看详情