经典问题,两个锁,相互锁,注意先锁住一个,保证开始的顺序。
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
typedef struct {
pthread_mutex_t lock_odd;
pthread_mutex_t lock_even;
}Locks;
void* print_even(void *args) {
int i = 1;
Locks* locks = (Locks*)(args);
for (i = 1; i <= 100; i++) {
if (i % 2 == 0 ) {
// 获取偶数的锁
pthread_mutex_lock(&locks->lock_even);
printf("%lu %d\n", pthread_self(), i);
// 释放奇数的锁
pthread_mutex_unlock(&locks->lock_odd);
}
}
return NULL;
}
void* print_odd(void* args) {
int i = 1;
Locks* locks = (Locks*)(args);
for (i = 1; i <= 100; i++) {
if (i % 2 != 0 ) {
// 获取奇数的锁
pthread_mutex_lock(&locks->lock_odd);
printf("%lu %d\n", pthread_self(), i);
// 释放偶数的锁
pthread_mutex_unlock(&locks->lock_even);
}
}
return NULL;
}
int main(int argc, const char * argv[]) {
pthread_t even, odd;
pthread_mutex_t lock_odd;
pthread_mutex_t lock_even;
pthread_mutex_init(&lock_odd, NULL);
pthread_mutex_init(&lock_even, NULL);
Locks locks = {lock_odd, lock_even};
// 先锁住偶数的锁 保证1先输出
pthread_mutex_lock(&locks.lock_even);
pthread_create(&even, NULL, print_odd, (void*)&locks);
pthread_create(&odd, NULL, print_even, (void*)&locks);
pthread_join(even, NULL);
pthread_join(odd, NULL);
pthread_mutex_destroy(&lock_odd);
pthread_mutex_destroy(&lock_even);
return 0;
}