如果将互斥锁属性的类型设置为PTHREAD_MUTEX_RECURSIVE,则同一个线程可以多次进入临界区
程序如下
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
pthread_mutex_t mutex;
pthread_mutexattr_t attr;
void* func(void* arg){
if(*(char*)arg == '\0') return NULL;
pthread_mutex_lock(&mutex);
char* str = (char*)arg;
while(*str != '\0'){
fputc(*str, stdout);
str++;
}
fputc('\n', stdout);
func((char*)arg+1);
pthread_mutex_unlock(&mutex);
return NULL;
}
int main(){
int ret;
if(( ret = pthread_mutexattr_init(&attr)) != 0){
fprintf(stderr, "create mutex attribute error. msg:%s", strerror(ret));
exit(1);
}
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&mutex, &attr);
pthread_t p1, p2;
char str1[8], str2[8];
sprintf(str1, "abcdefg");
sprintf(str2, "1234567");
if((ret = pthread_create(&p1, NULL, func, str1)) != 0){
fprintf(stderr, "create thread error. msg:%s", strerror(ret));
exit(1);
}
if((ret = pthread_create(&p2, NULL, func, str2)) != 0){
fprintf(stderr, "create thread error. msg:%s", strerror(ret));
exit(1);
}
pthread_join(p1, NULL);
pthread_join(p2, NULL);
}
分享到:
相关推荐
1. 快速型(PTHREAD_MUTEX_FAST_NP):这是默认的互斥锁类型,当一个线程已经锁定了互斥量时,再次调用锁定操作将会阻塞。 2. 递归型(PTHREAD_MUTEX_RECURSIVE_NP):如果一个线程已经锁定了互斥量,再次调用锁定...
为了解决这个问题,开发者需要在初始化互斥锁时显式设置`PTHREAD_MUTEX_RECURSIVE`属性,使得同一线程可以递归加锁和解锁。 以下是五个提高Linux多线程编程效率的经验: 1. 初始化互斥锁时设置`recursive`属性:...
本文将深入探讨pthread的基本用法,包括线程创建、线程返回值处理、以及互斥锁(Mutex)的使用,帮助开发者更好地理解和掌握这一关键的多线程接口。 一、pthread线程创建与管理 pthread库提供了创建和管理线程的...
与Windows临界区不同,pthread的互斥锁可以设置为进程间可见,通过传递适当的属性(如`PTHREAD_PROCESS_SHARED`)在多个进程之间实现同步。这使得pthread的互斥锁在跨进程同步方面更具有灵活性。 在性能方面,由于...
为了避免这种情况,可以使用`pthread_mutexattr_settype`函数设置互斥锁属性为`PTHREAD_MUTEX_RECURSIVE`,这样同一线程可以多次加锁并相应地解锁,防止死锁。 3. **正确使用条件变量** 条件变量常用于线程间的...
- **线程同步:**使用互斥锁、条件变量等机制来协调线程间的操作顺序。 - **使用64位体系结构:** - 在64位环境下进行多线程编程时需要注意内存对齐、原子操作等问题。 #### 二、基本线程编程 - **线程库:** ...
1. 初始化互斥锁时尽量设置`recursive`属性 在Linux中,默认情况下,互斥锁不支持递归加锁。如果一个线程试图在一个已经由它自己锁定的互斥锁上再次加锁,程序可能会进入死锁状态。为了避免这种情况,开发者可以显式...
但在某些情况下,递归锁是必要的,可以使用`pthread_mutexattr_settype`函数设置互斥锁属性为`PTHREAD_MUTEX_RECURSIVE`,允许同一线程多次加锁。 3. **正确使用线程局部存储(TLS)**: 线程局部存储是一种数据...
- **解决方案**:可以通过设置互斥锁的`PTHREAD_MUTEX_RECURSIVE`属性来允许递归加锁,避免因误操作导致的死锁问题。示例代码如下: ```c // 创建一个递归互斥锁 pthread_mutexattr_t attr; pthread_mutexattr...
在创建互斥锁时,可以使用`pthread_mutexattr_settype`函数来设定属性,将类型设为`PTHREAD_MUTEX_RECURSIVE`,允许同一线程多次加锁。这样可以处理那些需要在同一线程内重复调用加锁操作的复杂情况。 其次,条件...
`pthread_mutexattr_settype` 是一个用于设置互斥锁属性的函数,它接收两个参数:一个指向`pthread_mutexattr_t`类型的指针`attr`,以及一个表示锁类型的整型值`type`。以下是四种可设置的锁类型: 1. **PTHREAD_...
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&lock, &attr); ``` 2. **避免持有锁时调用阻塞操作**:在信号处理函数中,如果已经持有了锁,应避免调用可能阻塞的操作,因为...
在Windows中,Mutex是可递归的,即一个线程可以多次获得同一Mutex,而在Linux下,默认的pthread_mutex_t是不可递归的,若需递归,需要显式设置PTHREAD_MUTEX_RECURSIVE属性。误用非递归锁可能导致死锁,例如在一个...
为了避免这一问题,开发者应当在初始化互斥锁时,明确设置递归属性。 清单1展示了错误的互斥锁使用方式,代码中创建了一个互斥锁并进行了初始化,但未显式指定递归属性。正确的做法是在`pthread_mutexattr_init(&...
本项目"SFLockDemo"正是一个实践性的教程,帮助开发者模拟实现自旋锁(Spin Lock)、互斥锁(Mutex Lock)、递归锁(Recursive Lock)以及条件锁(Condition Lock)。下面将详细介绍这四种锁的工作原理和应用场景。 ...