首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

尝试获取pthread_mutex_lock(&mutex)的线程如果他们没有获得锁定会发生什么?

如果尝试获取pthread_mutex_lock(&mutex)的线程没有获得锁定,会发生以下情况:

  1. 阻塞等待:线程会被阻塞,进入等待状态,直到获取到锁定为止。在等待期间,线程会暂停执行,并且不会占用CPU资源。
  2. 竞争锁定:如果有多个线程同时尝试获取同一个互斥锁,它们会竞争锁定。只有一个线程能够成功获取到锁定,而其他线程则会继续等待或进行其他操作。
  3. 死锁:如果多个线程在不同的代码路径中尝试获取同一个互斥锁,并且没有适当的同步机制来避免死锁,可能会导致死锁的发生。死锁是指两个或多个线程相互等待对方释放资源,导致程序无法继续执行。

在处理多线程编程时,正确地处理互斥锁的获取和释放是非常重要的,以避免出现竞争条件、死锁等问题。在云计算领域中,互斥锁通常用于保护共享资源的访问,确保多个线程或进程之间的数据一致性和正确性。

腾讯云提供了一系列与云计算相关的产品,如云服务器、云数据库、云存储等,可以帮助开发者构建稳定、安全、高效的云计算应用。具体产品介绍和相关链接地址可以参考腾讯云官方网站:https://cloud.tencent.com/

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 详解Linux多线程中互斥锁、读写锁、自旋锁、条件变量、信号量

    ---- Hello、Hello大家好,我是木荣,今天我们继续来聊一聊Linux中多线程编程中的重要知识点,详细谈谈多线程中同步和互斥机制。 同步和互斥 互斥:多线程中互斥是指多个线程访问同一资源时同时只允许一个线程对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的; 同步:多线程同步是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源

    02

    Linux线程编程同步之互斥锁和条件变量

    今天是最后一篇关于Linux线程编程的文章分享,在这里我们先掌握基础的概念及其应用,后面在慢慢去深入学习。最近看到一句说的非常在理:理论’是你知道是这样,但它却不好用。‘实践’是它很好用,但你不知道是为什么。我想大多数学习者,和我一样,在学习的过程中,都会或多或少的有这种情况,不过自己坚信,你把基础打好(同时学的过程中,不要好高骛远,三心二意的,把自己先暂时用到的东西学明白,再去学其他东西,不要当前的,没学会,又跑去学其他的,而且又学不会,这样浪费时间和精力;这个这里基础打好,举个例子,你的c语言功底要打好,对指针的使用非常熟悉,甚至一些高级用法就是要平时慢慢积累和总结,以及内存原理要知道为什么是这样等方面),后面实战的话,就好多了,至少不会说我这个东西不会那个东西又不会,这样会让自己很痛苦当初为啥没学好基础,现在实战中漏洞百出。好了,废话不多说了,开始下面的主题分享:

    03

    futex机制介绍「建议收藏」

    1、概念 futex: a sort of fast, user-space mutual exclusion primitive. Futex是一种用户态和内核态混合的同步机制。首先,同步的进程间通过mmap共享一段内存,futex变量就位于这段共享的内存中且操作是原子的,当进程尝试进入互斥区或者退出互斥区的时候,先去查看共享内存中的futex变量,如果没有竞争发生,则只修改futex,而不用再执行系统调用了。当通过访问futex变量告诉进程有竞争发生,则还是得执行系统调用去完成相应的处理(wait 或者 wake up)。简单的说,futex就是通过在用户态的检查,(motivation)如果了解到没有竞争就不用陷入内核了,大大提高了low-contention时候的效率。 https://lwn.net/Articles/172149/ https://lwn.net/Articles/360699/ 2、futex的由来 为什么要有futex,他解决什么问题?何时加入内核的?我们来看下 经研究发现,很多同步是无竞争的,即某个进程进入互斥区,到再从某个互斥区出来这段时间,常常是没有进程也要进这个互斥区或者请求同一同步变量的。但是在这种情况下,这个进程也要陷入内核去看看有没有人和它竞争,退出的时侯还要陷入内核去看看有没有进程等待在同一同步变量上。这些不必要的系统调用(或者说内核陷入)造成了大量的性能开销。为了解决这个问题,Futex就应运而生。 前面的概念已经说了,futex是一种用户态和内核态混合同步机制,为什么会是用户态+内核态,听起来有点复杂,由于我们应用程序很多场景下多线程都是非竞争的,也就是说多任务在同一时刻同时操作临界区的概率是比较小的,大多数情况是没有竞争的,在早期内核同步互斥操作必须要进入内核态,由内核来提供同步机制,这就导致在非竞争的情况下,互斥操作扔要通过系统调用进入内核态。 我们来看一下程序 程序1: pthread_mutex_t lock; int count = 0; void thread1() { while(1) { pthread_mutex_lock(&lock); /* do something */ count++; pthread_mutex_unlock(&lock); } } void thread2() { while(1) { sleep(60); pthread_mutex_lock(&lock); count = 0; pthread_mutex_unlock(&lock); } } pthread_create(&tid1, NULL, thread1, NULL); pthread_create(&tid2, NULL, thread1, NULL);

    01

    UNPv2第七章:互斥锁与条件变量

     pthread_mutex_lock()函数是一个阻塞型的上锁函数,若互斥锁已经上了锁,调用pthread_mutex_lock()函数对互斥锁再次上锁的话,调用线程会阻塞,直到当前互斥锁被解锁。  pthread_mutex_trylock()函数是一个非阻塞型的上锁函数,如果互斥锁没被锁住,pthread_mutex_trylock()函数将把互斥锁加锁, 并获得对共享资源的访问权限;如果互斥锁被锁住了,pthread_mutex_trylock()函数将不会阻塞等待而直接返回EBUSY(已加锁错误),表示共享资源处于繁忙状态。  如果互斥锁变量mutex已经上锁,调用pthread_mutex_unlock()函数将解除这个锁定,否则直接返回。该函数唯一的参数mutex是pthread_mutex_t数据类型的指针。该函数调用成功返回0,否则返回-1。

    05

    一个线程安全的单例模式测试

    单例模式,一般我喜欢这样实现 class SingleTest { public: static SingleTest *Instance(); protected: SingleTest(); ~SingleTest(); private: int m; }; SingleTest *SingleTest::Instance() { static SingleTest st; return &st; } SingleTest::SingleTest() { m = 0; printf("SingleTest Create\n"); } SingleTest::~SingleTest() { printf("SingleTest Destroy\n"); } 然后这样用 SingleTest *ts = SingleTest::Instance(); 这么实现的一个好处就是比较简单,而且不会有内存泄露。但如果在多线程环境下是否安全呢?多线程环境下可能会有两种情况: 第一,如果两个线程同时调用SingleTest *ts = SingleTest::Instance();,如果线程一先执行构造,但还没构造完,线程二构造的时候发现还没有构造实例,会再次执行构造,单例就变成了两例。 第二,如果两个线程都要对成员变量进行读写,那么会不会发生竞争呢? 理论分析一下: 第一种情况,C++11标准的编译器是线程安全的,C++11标准要求编译器保证static的线程安全。而C++11之前标准的编译器则是不确定,关键看编译器的实现。 第二种情况,任何标准下都不是线程安全的。 第一种情况,因为有标准的硬性规定,倒是不需要测试了。那么第二种情况什么样?写个代码测试一下 #include <stdio.h> #include <pthread.h> #include <unistd.h> class SingleTest { public: static SingleTest *Instance(); void test(); int get(); protected: SingleTest(); ~SingleTest(); private: int m; }; SingleTest *SingleTest::Instance() { static SingleTest st; return &st; } void SingleTest::test() { int i, loc; for (i = 0; i < 5000; ++i) { loc = m; ++loc; m = loc; } } int SingleTest::get() { return m; } SingleTest::SingleTest() { m = 0; printf("SingleTest Create\n"); } SingleTest::~SingleTest() { printf("SingleTest Destroy\n"); } void *threadFunc(void *arg) { SingleTest *ts = SingleTest::Instance(); ts->test(); return NULL; } int main(int argc, char* argv[]) { int s; pthread_t tid1; pthread_t tid2; s = pthread_create(&tid1, NULL, threadFunc, NULL); if (s != 0) printf("thread 1 create error:%d\n", s); s = pthread_create(&tid2, NULL, threadFunc, NULL); if (s != 0) printf("thread 2 create error:%d\n", s); s = pthread_join(tid1, NULL); if (s != 0) printf("thread 1 join error:%d\n", s); s = pthread_join(tid2, NULL); if (s != 0) printf("thread 2 join error:%d\n", s

    02

    Java Concurrent synchronized 使用&原理

    sychronized 是Java语法层面的同步策略,可以用来修饰instance变量、object reference(对象引用)、static函数和class literals(类名称字面常量)。 1、当非static 元素被sychronized修饰时,当前线程都会取得该对象锁,该对象的其他线程均无法访问任何被sychronized修饰的变量或方法。即一个类如果有n个方法被sychronized修饰时,a线程取得对象锁之后,其他线程除a线程正在使用的方法无法使用外,其他需要对象锁的方法均无法使用。即一个对象仅有一个对象锁,一个线程取得后,其他线程都无法获得,其他线程都要阻塞。 2、不同的对象实例的 synchronized方法是不相干扰的。 3、当static 元素被sychronize修饰时,可以防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。 注意:synchronized都是会阻塞线程的,就是说会发生上下文切换,从用户态切换到内核态,所以由sychronized实现对象锁代价较高(新的JDK版本已经优化的较好,但这种方式代价仍然不小),并且使用sychronized涉及对象锁如果在两个以上很容易造成死锁,谨慎使用同步策略,避免无谓的取锁。 很显然sychronized是一种独占锁,也就是悲观锁,默认一定会发生资源争用,所以每次都默认取锁。

    04
    领券