递归锁
应用场景:
示例:
#include <stdio.h> #include <stdlib.h> #include <pthread.h> // 同一个线程可以多次获取同一个递归锁,不会产生死锁。 int counter = 0; pthread_mutex_t g_mutex; // = PTHREAD_MUTEX_INITIALIZER; #include <stdio.h> #include <stdlib.h> #include <pthread.h> // 同一个线程可以多次获取同一个递归锁,不会产生死锁。 int counter = 0; pthread_mutex_t g_mutex; // = PTHREAD_MUTEX_INITIALIZER; void *doit(void *arg) { int i, val; for (i = 0; i < 5000; i++) { pthread_mutex_lock(&g_mutex); pthread_mutex_lock(&g_mutex); val = counter; printf("%x: %d\n", pthread_self(), val + 1); counter = val + 1; pthread_mutex_unlock(&g_mutex); pthread_mutex_unlock(&g_mutex); } } int main(int argc, char *argv[]) { // create recursive attribute pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); //set recursive attribute pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&g_mutex, &attr); pthread_t tid1, tid2; pthread_create(&tid1, NULL, doit, NULL); pthread_create(&tid2, NULL, doit, NULL); pthread_join(tid1, NULL); pthread_join(tid2, NULL); pthread_mutex_destroy(&g_mutex); //destroy recursive attribute pthread_mutexattr_destroy(&attr); return 0; }
#include <stdio.h> #include <stdlib.h> #include <pthread.h> // 如果一个线程多次获取同一个非递归锁,则会产生死锁。 int counter = 0; pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER; void *doit(void *arg) { int i, val; for (i = 0; i < 5000; i++) { pthread_mutex_lock(&g_mutex); //pthread_mutex_lock(&g_mutex); //非递归锁加两次就会产生死锁。 val = counter; printf("%x: %d\n", pthread_self(), val + 1); counter = val + 1; pthread_mutex_unlock(&g_mutex); //pthread_mutex_unlock(&g_mutex); } } int main(int argc, char *argv[]) { pthread_t tid1, tid2; pthread_create(&tid1, NULL, doit, NULL); pthread_create(&tid2, NULL, doit, NULL); pthread_join(tid1, NULL); pthread_join(tid2, NULL); return 0; }
浙公网安备 33010602011771号