Chinaunix首页 | 论坛 | 博客
  • 博客访问: 201198
  • 博文数量: 81
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 540
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-04 12:48
文章分类
文章存档

2015年(23)

2014年(58)

我的朋友

分类: C/C++

2014-12-17 10:45:14

嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果是不同线程请求,则在加锁线程解锁时重新竞争。

点击(此处)折叠或打开

  1. #include <pthread.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. pthread_mutex_t mutex;
  6. pthread_mutexattr_t attr;
  7. void* func(void* arg){
  8.     if(*(char*)arg == '\0') return NULL;
  9.     pthread_mutex_lock(&mutex);        
  10.     char* str = (char*)arg;
  11.     while(*str != '\0'){
  12.         fputc(*str, stdout);
  13.         str++;
  14.     }
  15.     fputc('\n', stdout);
  16.     func((char*)arg+1);
  17.     pthread_mutex_unlock(&mutex);        
  18.     return NULL;
  19. }
  20. int main(){
  21.     int ret;
  22.     if(( ret = pthread_mutexattr_init(&attr)) != 0){
  23.         fprintf(stderr, "create mutex attribute error. msg:%s", strerror(ret));
  24.         exit(1);
  25.     }
  26.     pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
  27.     pthread_mutex_init(&mutex, &attr);    
  28.     pthread_t p1, p2;
  29.     char str1[8], str2[8];
  30.     sprintf(str1, "abcdefg");
  31.     sprintf(str2, "1234567");
  32.     if((ret = pthread_create(&p1, NULL, func, str1)) != 0){
  33.         fprintf(stderr, "create thread error. msg:%s", strerror(ret));
  34.         exit(1);
  35.     }
  36.     if((ret = pthread_create(&p2, NULL, func, str2)) != 0){
  37.         fprintf(stderr, "create thread error. msg:%s", strerror(ret));
  38.         exit(1);
  39.     }
  40.     pthread_join(p1, NULL);
  41.     pthread_join(p2, NULL);
  42. }


阅读(2466) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~