44 lines
1021 B
C
44 lines
1021 B
C
#include <pthread.h>
|
|
#include <unistd.h>
|
|
#include <assert.h>
|
|
#include <stdio.h>
|
|
|
|
static pthread_mutex_t mutex;
|
|
|
|
static void *thread(void *arg) {
|
|
printf("[child] lock0\n");
|
|
pthread_mutex_lock(&mutex);
|
|
printf("[child] lock1\n");
|
|
pthread_mutex_lock(&mutex);
|
|
printf("[child] in inner lock!!!\n");
|
|
sleep(3);
|
|
pthread_mutex_unlock(&mutex);
|
|
printf("[child] in outer lock!!!\n");
|
|
pthread_mutex_unlock(&mutex);
|
|
printf("[child] unlocked!!!\n");
|
|
return NULL;
|
|
}
|
|
|
|
int main(int argc, const char **argv) {
|
|
pthread_mutexattr_t mutex_attr;
|
|
pthread_t handle0;
|
|
|
|
pthread_mutexattr_init(&mutex_attr);
|
|
pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE);
|
|
pthread_mutex_init(&mutex, &mutex_attr);
|
|
|
|
pthread_create(&handle0, NULL, thread, "thread0");
|
|
|
|
sleep(1);
|
|
|
|
pthread_mutex_lock(&mutex);
|
|
printf("[main] inside lock\n");
|
|
sleep(1);
|
|
pthread_mutex_unlock(&mutex);
|
|
|
|
pthread_join(handle0, NULL);
|
|
printf("[main] finished\n");
|
|
|
|
return 0;
|
|
}
|