//Avoid some times cann't include pthread_mutexattr_settype
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_mutex_t lock;
pthread_mutexattr_t attr;
pthread_t child;
char Buf[64];
void *childpthread(void *arg)
{
int j = 0;
int i = 0;
int ret;
while(1)
{
ret = pthread_mutex_lock(&lock);
if(ret != 0)
{
printf("child lock error\n");
}
for(i = 0;i < sizeof(Buf);i++)
{
ret = pthread_mutex_lock(&lock);
if(ret != 0)
{
printf("child relock error\n");
}
Buf[i] = '0' + (i%10);
usleep(5000);
ret = pthread_mutex_unlock(&lock);
if(ret != 0)
{
printf("child reunlock error\n");
}
}
printf("child Buf %s\n", Buf);
ret = pthread_mutex_unlock(&lock);
if(ret != 0)
{
printf("child unlock error\n");
}
j++;
if(j > 10)
{
j = 0;
sleep(10);
}
}
}
int main()
{
int i = 0;
int j = 0;
int ret;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&lock, &attr);
pthread_create(&child, NULL, childpthread, NULL);
while(1)
{
ret = pthread_mutex_lock(&lock);
if(ret != 0)
{
printf("main lock error\n");
}
for(i = 0;i < sizeof(Buf);i++)
{
Buf[i] = 'a' + (i%10);
usleep(5000);
}
printf("main Buf %s\n", Buf);
ret = pthread_mutex_unlock(&lock);
if(ret != 0)
{
printf("main unlock error\n");
}
j++;
if(j > 10)
{
j = 0;
sleep(10);
}
}
return 0;
}