linux互斥鎖_pthread_mutex_反覆調用

一、互斥鎖

1.1 基本API:

#include <pthread.h>

     int
     pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);

int
pthread_mutex_destroy(pthread_mutex_t *mutex);

1.2 屬性API:

    int
     pthread_mutexattr_init(pthread_mutexattr_t *attr);

     int
     pthread_mutexattr_destroy(pthread_mutexattr_t *attr);

     int
     pthread_mutexattr_setprioceiling(pthread_mutexattr_t *attr, int prioceiling);

     int
     pthread_mutexattr_getprioceiling(pthread_mutexattr_t *attr, int *prioceiling);

     int
     pthread_mutexattr_setprotocol(pthread_mutexattr_t *attr, int protocol);

     int
     pthread_mutexattr_getprotocol(pthread_mutexattr_t *attr, int *protocol);

     int
     pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type);

     int
     pthread_mutexattr_gettype(pthread_mutexattr_t *attr, int *type);

     int
     pthread_mutexattr_setpolicy_np(pthread_mutexattr_t *attr, int policy);

     int
     pthread_mutexattr_getpolicy_np(pthread_mutexattr_t *attr, int *policy);

1.3 本文範圍:

本文重點描述

pthread_mutexattr_settype的用法,其他的可以參考:mutexattr中文描述

 

二、同一線程內重複申請鎖

互斥鎖,提供一種屬性類型,允許同一線程內反覆調用lock,但必須有對應的unlock操作,

2.1 僞代碼:

1. 初始mutex和mutexattr實例

2. mutexattr設置反覆調用的type

3.創建線程

4.主線程和子線程同時爭搶資源,且子線程遞歸函數內,重複申請資源

2.2 C代碼:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

pthread_mutex_t g_mutex;


int test_recursive(int *n)
{
	if(*n>10) return 0;
	
	pthread_mutex_lock(&g_mutex);
	printf("%s, n=%d\n", "slave",*n);
	(*n)++;
	test_recursive(n);
	pthread_mutex_unlock(&g_mutex);
	
	return 1;
}

void *func(void *context)
{
	pthread_mutex_t *mut = context;
	int n=0;
	int m=0;
	
	while(m++ < 5){
		n = 0;
		printf("#####slave loop %d\n", m);
		test_recursive(&n);
		usleep(10);
	}	
	
	return NULL;	
}


int main(int argc, char **argv)
{
  pthread_mutexattr_t mutexatr;
  int n=0;

  if(pthread_mutexattr_init(&mutexatr)){
	printf("mutexattr init failed, %s,%d\n",__FUNCTION__, __LINE__);
	exit(0);
  }

  pthread_mutexattr_settype(&mutexatr, PTHREAD_MUTEX_RECURSIVE);

  if(pthread_mutex_init(&g_mutex, &mutexatr)){
	printf("mutex init err\n");
  }

  pthread_t pth;
  pthread_create(&pth, NULL, func, &g_mutex);

  int i=2;
  while(i-- > 0){
	pthread_mutex_lock(&g_mutex);
	printf("master,%d\n", ++n);
	pthread_mutex_unlock(&g_mutex);
	usleep(10);
  }
  printf("waiting for subthread quit\n");
  pthread_join(pth, NULL);
  printf("subthread already quit\n");
  pthread_mutexattr_destroy(&mutexatr);
  pthread_mutex_destroy(&g_mutex);

  return 0;

}

2.3 compile:

gcc -lpthread lock_mutex.c -o lock_mutex

 

2.4 run

./lock_mutex 

2.5 result:

master,1
#####slave loop 1
slave, n=0
slave, n=1
slave, n=2
slave, n=3
slave, n=4
slave, n=5
slave, n=6
slave, n=7
slave, n=8
slave, n=9
slave, n=10
master,2
#####slave loop 2
slave, n=0
slave, n=1
slave, n=2
slave, n=3
slave, n=4
slave, n=5
slave, n=6
slave, n=7
slave, n=8
slave, n=9
slave, n=10
waiting for subthread quit
#####slave loop 3
slave, n=0
slave, n=1
slave, n=2
slave, n=3
slave, n=4
slave, n=5
slave, n=6
slave, n=7
slave, n=8
slave, n=9
slave, n=10
#####slave loop 4
slave, n=0
slave, n=1
slave, n=2
slave, n=3
slave, n=4
slave, n=5
slave, n=6
slave, n=7
slave, n=8
slave, n=9
slave, n=10
#####slave loop 5
slave, n=0
slave, n=1
slave, n=2
slave, n=3
slave, n=4
slave, n=5
slave, n=6
slave, n=7
slave, n=8
slave, n=9
slave, n=10
subthread already quit

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章