如果将互斥锁属性的类型设置为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);
}
分享到:
相关推荐
多线程编程:互斥锁使用。 打包文件包含两个文件:c文件源代码、Makefile文件,运行环境在Ubuntu14.04下,使用自带的gcc编译器,同学们只需将文件夹复制到某一目录下之后在终端执行:1.“make”生成“test”可执行...
对于静态分配的互斥量, 可以把它设置为PTHREAD_MUTEX_INITIALIZER, 或者调用pthread_mutex_init. 对于动态分配的互斥量, 在申请内存(malloc)之后, 通过pthread_mutex_init进行初始化, 并且在释放内存(free)前需要...
linux 同步与互斥 posix 线程互斥 实现 。(此为博客http://blog.csdn.net/shallnet 文章对应源码下载)
pthread_mutex_t 类型,其本质是一个结构体。为简化理解,应用时可忽略其实现细节,简单当成整数看待。 pthread_mutex_t mutex; 变量mutex只有两种取值1、0。 pthread_mutex_init函数 初始化一个互斥锁(互斥量) --->...
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是动态分配的,则释放内存前...
线程间无需特别的手段进行通信,因为线程间可以共享数据结构,也就是一个全局...当一个线程执行到 pthread_mutex_lock处时,如果该锁此时被另一个线程使用,那此线程被阻塞,即程序将等待到另一个线程释放此互斥锁。
Linux中使用`pthread_mutex_t`类型来实现互斥锁,通过`pthread_mutex_init()`初始化,`pthread_mutex_lock()`上锁,`pthread_mutex_unlock()`解锁。 2. **信号量(Semaphore)**:信号量是一种更为灵活的同步工具,...
可以通过设置锁的属性,避免同一条线程重复上锁导致死锁的问题。 通过int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type)接口设置 一般是以下四种属性: PTHREAD_MUTEX_NORMAL This type of ...
linux 同步与互斥 posix 线程同步互斥 消费者生产者 实现 。(此为博客http://blog.csdn.net/shallnet 文章对应源码下载)
linux 内核 mutex.c 源码分析实例,我的实例主要先初始化了一个互斥体m,然后获取互斥体的锁(解锁),紧接着释放互斥体的锁(解锁)。最后释放互斥体。中间通过输出m.count来显示互斥体的状态。
ucos-ii中互斥信号mutex建立源码
pthread_mutex_t lock; int readpos, writepos; pthread_cond_t notempty; pthread_cond_t notfull; }; void init(struct prodcons *b) { pthread_mutex_init(&b->lock, NULL); pthread_cond_init(&b->notempty, NU
ConsoleApp_Mutex,C++互斥锁源码cpp,可在VC++6.0或VS下直接编译运行,演示结果,控制台程序,ConsoleApp_Mutex,C++互斥锁源码cpp,可在VC++6.0或VS下直接编译运行,演示结果,控制台程序,
互斥量(也称为互斥锁)出自POSIX线程标准,可以用来... 互斥量类型声明为pthread_mutex_t数据类型,在中有具体的定义。 1、互斥量初始化和销毁 /* Initialize a mutex. */ int pthread_mutex_init (pthrea
MPI_Mutex MPI的互斥体仿真 用法 该互斥锁旨在锁定特定的远程内存(RM),例如等级0。这意味着充当互斥锁的布尔值位于特定的等级中。但是,当获取关键部分时,任何其他通信都可以是过程安全的。 然后,确保创建将与...
linux和win32下通用的互斥锁Mutex封装,统一接口,可直接使用
多线程之间的同步与互斥,详情看博客:http://blog.csdn.net/mybelief321/article/details/9390707
算法的思想是,每个哲学家想要进餐时,先... pthread_mutex_t mutex; pthread_cond_t chopstick[5]; 另外创建数组sticks[5]表示这五个筷子收否可用,当sticks[i]等于1时,表示筷子i可用,等于0表示这个筷子不可用。
很久没看APUE,今天一位朋友问道关于一个mutex的问题,又翻到了以前讨论过的东西,为了...创建和注销 条件变量和互斥锁一样,都有静态动态两种创建方式,静态方式使用PTHREAD_COND_INITIALIZER常量,如下: 代码如下:
它比boost::shared_mutex快。 lock_shared非常贪婪,因此等待lock时间是不公平的。 这应该没有问题,因为此互斥对象适用于被动写入器-主动读取器方案。 最好情况下, lock_shared只是一个fetch_add 。 在最佳...