`

将互斥锁属性的类型设置为PTHREAD_MUTEX_RECURSIVE

 
阅读更多

如果将互斥锁属性的类型设置为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);
}	
 

 

分享到:
评论

相关推荐

    Linux互斥锁、条件变量和信号量[归类].pdf

    1. 快速型(PTHREAD_MUTEX_FAST_NP):这是默认的互斥锁类型,当一个线程已经锁定了互斥量时,再次调用锁定操作将会阻塞。 2. 递归型(PTHREAD_MUTEX_RECURSIVE_NP):如果一个线程已经锁定了互斥量,再次调用锁定...

    Linux的多线程编程的高效开发经验

    为了解决这个问题,开发者需要在初始化互斥锁时显式设置`PTHREAD_MUTEX_RECURSIVE`属性,使得同一线程可以递归加锁和解锁。 以下是五个提高Linux多线程编程效率的经验: 1. 初始化互斥锁时设置`recursive`属性:...

    pthread经典用法

    本文将深入探讨pthread的基本用法,包括线程创建、线程返回值处理、以及互斥锁(Mutex)的使用,帮助开发者更好地理解和掌握这一关键的多线程接口。 一、pthread线程创建与管理 pthread库提供了创建和管理线程的...

    pthread和win32的临界区 Critical Section 比较

    与Windows临界区不同,pthread的互斥锁可以设置为进程间可见,通过传递适当的属性(如`PTHREAD_PROCESS_SHARED`)在多个进程之间实现同步。这使得pthread的互斥锁在跨进程同步方面更具有灵活性。 在性能方面,由于...

    linux的多线程编程的高效开发经验.pdf

    为了避免这种情况,可以使用`pthread_mutexattr_settype`函数设置互斥锁属性为`PTHREAD_MUTEX_RECURSIVE`,这样同一线程可以多次加锁并相应地解锁,防止死锁。 3. **正确使用条件变量** 条件变量常用于线程间的...

    linux多线程编程指南

    - **线程同步:**使用互斥锁、条件变量等机制来协调线程间的操作顺序。 - **使用64位体系结构:** - 在64位环境下进行多线程编程时需要注意内存对齐、原子操作等问题。 #### 二、基本线程编程 - **线程库:** ...

    linux的多线程编程的高效开发经验[归类].pdf

    1. 初始化互斥锁时尽量设置`recursive`属性 在Linux中,默认情况下,互斥锁不支持递归加锁。如果一个线程试图在一个已经由它自己锁定的互斥锁上再次加锁,程序可能会进入死锁状态。为了避免这种情况,开发者可以显式...

    linux的多线程编程的高效开发经验借鉴.pdf

    但在某些情况下,递归锁是必要的,可以使用`pthread_mutexattr_settype`函数设置互斥锁属性为`PTHREAD_MUTEX_RECURSIVE`,允许同一线程多次加锁。 3. **正确使用线程局部存储(TLS)**: 线程局部存储是一种数据...

    高效linux的多线程编程经验12条总结

    - **解决方案**:可以通过设置互斥锁的`PTHREAD_MUTEX_RECURSIVE`属性来允许递归加锁,避免因误操作导致的死锁问题。示例代码如下: ```c // 创建一个递归互斥锁 pthread_mutexattr_t attr; pthread_mutexattr...

    Linux多线程编程的高效开发经验.

    在创建互斥锁时,可以使用`pthread_mutexattr_settype`函数来设定属性,将类型设为`PTHREAD_MUTEX_RECURSIVE`,允许同一线程多次加锁。这样可以处理那些需要在同一线程内重复调用加锁操作的复杂情况。 其次,条件...

    Linux多线程锁属性设置方法

    `pthread_mutexattr_settype` 是一个用于设置互斥锁属性的函数,它接收两个参数:一个指向`pthread_mutexattr_t`类型的指针`attr`,以及一个表示锁类型的整型值`type`。以下是四种可设置的锁类型: 1. **PTHREAD_...

    Linux 实时信号程序中锁的探索

    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&lock, &attr); ``` 2. **避免持有锁时调用阻塞操作**:在信号处理函数中,如果已经持有了锁,应避免调用可能阻塞的操作,因为...

    线程同步分析

    在Windows中,Mutex是可递归的,即一个线程可以多次获得同一Mutex,而在Linux下,默认的pthread_mutex_t是不可递归的,若需递归,需要显式设置PTHREAD_MUTEX_RECURSIVE属性。误用非递归锁可能导致死锁,例如在一个...

    Linux 的多线程编程的高效开发经验

    为了避免这一问题,开发者应当在初始化互斥锁时,明确设置递归属性。 清单1展示了错误的互斥锁使用方式,代码中创建了一个互斥锁并进行了初始化,但未显式指定递归属性。正确的做法是在`pthread_mutexattr_init(&...

    SFLockDemo:自己模拟实现自旋锁,互斥锁,递归锁,条件锁

    本项目"SFLockDemo"正是一个实践性的教程,帮助开发者模拟实现自旋锁(Spin Lock)、互斥锁(Mutex Lock)、递归锁(Recursive Lock)以及条件锁(Condition Lock)。下面将详细介绍这四种锁的工作原理和应用场景。 ...

Global site tag (gtag.js) - Google Analytics