`

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

 

分享到:
评论

相关推荐

    多线程编程——互斥锁使用(Jack_pthread_mutex_test.rar)

    多线程编程:互斥锁使用。 打包文件包含两个文件:c文件源代码、Makefile文件,运行环境在Ubuntu14.04下,使用自带的gcc编译器,同学们只需将文件夹复制到某一目录下之后在终端执行:1.“make”生成“test”可执行...

    Linux C 多线程编程之互斥锁与条件变量实例详解

    对于静态分配的互斥量, 可以把它设置为PTHREAD_MUTEX_INITIALIZER, 或者调用pthread_mutex_init. 对于动态分配的互斥量, 在申请内存(malloc)之后, 通过pthread_mutex_init进行初始化, 并且在释放内存(free)前需要...

    pthread_mutex

    linux 同步与互斥 posix 线程互斥 实现 。(此为博客http://blog.csdn.net/shallnet 文章对应源码下载)

    Linux系统编程之线程同步

    pthread_mutex_t 类型,其本质是一个结构体。为简化理解,应用时可忽略其实现细节,简单当成整数看待。 pthread_mutex_t mutex; 变量mutex只有两种取值1、0。 pthread_mutex_init函数 初始化一个互斥锁(互斥量) ---&gt;...

    互斥量mutex的简单使用(实例讲解)

    int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutex_t *restrict attr); //初始化mutex int pthread_mutex_destroy(pthread_mutex_t *mutex); //如果mutex是动态分配的,则释放内存前...

    Linux下多线程间通信

    线程间无需特别的手段进行通信,因为线程间可以共享数据结构,也就是一个全局...当一个线程执行到 pthread_mutex_lock处时,如果该锁此时被另一个线程使用,那此线程被阻塞,即程序将等待到另一个线程释放此互斥锁。

    linux之线程同步的概要介绍与分析

    Linux中使用`pthread_mutex_t`类型来实现互斥锁,通过`pthread_mutex_init()`初始化,`pthread_mutex_lock()`上锁,`pthread_mutex_unlock()`解锁。 2. **信号量(Semaphore)**:信号量是一种更为灵活的同步工具,...

    Linux多线程锁属性设置方法

    可以通过设置锁的属性,避免同一条线程重复上锁导致死锁的问题。 通过int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type)接口设置 一般是以下四种属性: PTHREAD_MUTEX_NORMAL This type of ...

    3_pthread_sync_mutex_with_productor_and_consumer.tgz

    linux 同步与互斥 posix 线程同步互斥 消费者生产者 实现 。(此为博客http://blog.csdn.net/shallnet 文章对应源码下载)

    linux 内核mutex.c 源码分析实例

    linux 内核 mutex.c 源码分析实例,我的实例主要先初始化了一个互斥体m,然后获取互斥体的锁(解锁),紧接着释放互斥体的锁(解锁)。最后释放互斥体。中间通过输出m.count来显示互斥体的状态。

    create-mutex.zip_Mutex_mutex in ucos_uCOS mutex_ucos mutex

    ucos-ii中互斥信号mutex建立源码

    实验5--Linux-高级程序设计.doc

    pthread_mutex_t lock; int readpos, writepos; pthread_cond_t notempty; pthread_cond_t notfull; }; void init(struct prodcons *b) { pthread_mutex_init(&b-&gt;lock, NULL); pthread_cond_init(&b-&gt;notempty, NU

    C++ 互斥锁源码

    ConsoleApp_Mutex,C++互斥锁源码cpp,可在VC++6.0或VS下直接编译运行,演示结果,控制台程序,ConsoleApp_Mutex,C++互斥锁源码cpp,可在VC++6.0或VS下直接编译运行,演示结果,控制台程序,

    Linux线程同步之互斥量(mutex)

    互斥量(也称为互斥锁)出自POSIX线程标准,可以用来...  互斥量类型声明为pthread_mutex_t数据类型,在中有具体的定义。  1、互斥量初始化和销毁 /* Initialize a mutex. */ int pthread_mutex_init (pthrea

    MPI_Mutex:MPI的互斥体仿真

    MPI_Mutex MPI的互斥体仿真 用法 该互斥锁旨在锁定特定的远程内存(RM),例如等级0。这意味着充当互斥锁的布尔值位于特定的等级中。但是,当获取关键部分时,任何其他通信都可以是过程安全的。 然后,确保创建将与...

    linux和win32下通用的互斥锁Mutex封装

    linux和win32下通用的互斥锁Mutex封装,统一接口,可直接使用

    thread_mutex.c 文件

    多线程之间的同步与互斥,详情看博客:http://blog.csdn.net/mybelief321/article/details/9390707

    Linux下哲学家问题的实现

    算法的思想是,每个哲学家想要进餐时,先... pthread_mutex_t mutex; pthread_cond_t chopstick[5]; 另外创建数组sticks[5]表示这五个筷子收否可用,当sticks[i]等于1时,表示筷子i可用,等于0表示这个筷子不可用。

    pthread_cond_wait() 用法深入分析

    很久没看APUE,今天一位朋友问道关于一个mutex的问题,又翻到了以前讨论过的东西,为了...创建和注销 条件变量和互斥锁一样,都有静态动态两种创建方式,静态方式使用PTHREAD_COND_INITIALIZER常量,如下: 代码如下:

    shared_spin_mutex:共享自旋互斥锁

    它比boost::shared_mutex快。 lock_shared非常贪婪,因此等待lock时间是不公平的。 这应该没有问题,因为此互斥对象适用于被动写入器-主动读取器方案。 最好情况下, lock_shared只是一个fetch_add 。 在最佳...

Global site tag (gtag.js) - Google Analytics