【多线程】 锁策略 ( 悲观/乐观锁 、读写/互斥锁 、重量/轻量级锁、挂起等待/自旋锁 、公平/非公平锁 、可重入/不可重入锁) 目录 一、常见的锁策略 1. 悲观锁 VS 乐观锁 2. 读写锁 vs 普通的互斥锁 3. 重量级锁 vs 轻量级锁 4. 挂起等待锁 vs 自旋锁 小结 5. 公平锁 VS 非公平锁 6. 可重入...
pthread_mutex_t mutex;//定义互斥锁 初始化互斥锁 pthread_mutex_init(&mutex,NULL);//互斥锁初始化(第二个参数是 锁的属性) 加锁/解锁 //加了互斥锁 pthread_mutex_lock(&mutex); (*pcount)++; pthread_mutex_unlock(&mutex); 完整代码 #include<pthread.h> #include<stdio.h> #include<unistd.h> ...
C语言中主要有以下几种锁:1. 互斥锁 2. 自旋锁 3. 读写锁 4. 条件变量 互斥锁 互斥锁是一种最基本的锁,用于保护共享资源的访问,确保同一时刻只有一个线程可以访问共享资源。当一个线程需要访问共享资源时,它会尝试获取互斥锁。如果锁已经被其他线程占用,则该线程会被阻塞,直到获得锁为止。互...
读写锁可以分为两种类型:读锁和写锁。多个线程可以同时持有读锁,但是只能有一个线程可以持有写锁。当一个线程持有写锁时,其他线程无法获取读锁或写锁,直到该线程释放锁。下面是一个使用读写锁的示例程序:```c#include<stdio.h>#include<stdlib.h>#include<pthread.h>#defineNUM_THREADS5pthread_rwlock_t...
死锁的几种场景: 忘记释放锁 重复加锁(重复加相同的锁) 多线程多锁,抢占锁资源 //多线程多锁,抢占锁资源#include<stdio.h>#include<pthread.h>#include<unistd.h>// 创建2个互斥量pthread_mutex_t mutex1, mutex2; void *workA(void * arg) {pthread_mutex_lock(&mutex1);sleep(1);pthread_mutex_lo...
C语言多线程编程 死锁解析 1.假设有两个线程 A线程负责输出奇数。B线程负责输出偶数。 2.当A线程进入锁定状态是,主线程突然异常将A线程停止,这时将导致B线程也无法继续执行,处于死锁状态。如下代码: #include <stdio.h>#include<stdlib.h>#include<pthread.h>pthread_mutex_t m;void*runodd(void*d)...
多线程 层级锁 当要同时操作2个对象时,就需要同时锁定这2个对象,而不是先锁定一个,然后再锁定另一个。同时锁定多个对象的方法:std::lock(对象1.锁,对象2.锁...) 但是,有的时候,并不能同时得到所以要锁定的锁,必须是先锁定某个后,再锁定其他的,这种情况就不能使用std::lock函数了,怎么办呢,使用有顺序的...
一、互斥锁 互斥量从本质上说就是一把锁, 提供对共享资源的保护访问。 1. 初始化: 在Linux下, 线程的互斥量数据类型是pthread_mutex_t. 在使用前, 要对它进行初始化: 对于静态分配的互斥量, 可以把它设置为PTHREAD_MUTEX_INITIALIZER, 或者调用pthread_mutex_init. ...
4.多线程状态下,锁操作 //线程1 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [lock lock]; [obj method1]; sleep(30); [lock unlock]; }); //线程2 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ ...