几个重要的函数:
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutex_t *restrict attr); //初始化mutex
int pthread_mutex_destroy(pthread_mutex_t *mutex); //如果mutex是动态分配的,则释放内存前调用此函数。
int pthread_mutex_lock(pthread_mutex_t *mutex); //加锁
int pthread_mutex_trylock(pthread_mutex_t *mutex); //若已有其他线程占用锁,则返回EBUSY,否则返回0,不阻塞。
int pthread_mutex_unlock(pthread_mutex_t *mutex); //解锁
例程:
1 #include <stdlib.h> 2 #include <stdio.h> 3 #include <unistd.h> 4 #include <pthread.h> 5 #include <errno.h> 6 7 int a = 100; 8 int b = 200; 9 10 pthread_mutex_t lock; 11 12 void * threadA() 13 { 14 pthread_mutex_lock(&lock); 15 printf("thread A got lock!\n"); 16 a -= 50; 17 sleep(3); //如果不加锁,threadB输出会是50和200 18 b += 50; //加锁后会sleep 3秒后,并为b加上50 threadB才能打印 19 pthread_mutex_unlock(&lock); 20 printf("thread A released the lock!\n"); 21 a -= 50; 22 } 23 24 void * threadC() 25 { 26 sleep(1); 27 while(pthread_mutex_trylock(&lock) == EBUSY) //轮询直到获得锁 28 { 29 printf("thread C is trying to get lock!\n"); 30 usleep(100000); 31 } 32 printf("thread C got the lock!\n"); 33 a = 1000; 34 b = 2000; 35 pthread_mutex_unlock(&lock); 36 printf("thread C released the lock!\n"); 37 38 } 39 40 void * threadB() 41 { 42 sleep(2); //让threadA能先执行 43 pthread_mutex_lock(&lock); 44 printf("thread B got the lock! a=%d b=%d\n", a, b); 45 pthread_mutex_unlock(&lock); 46 printf("thread B released the lock!\n", a, b); 47 } 48 49 int main() 50 { 51 pthread_t tida, tidb, tidc; 52 pthread_mutex_init(&lock, NULL); 53 pthread_create(&tida, NULL, threadA, NULL); 54 pthread_create(&tidb, NULL, threadB, NULL); 55 pthread_create(&tidc, NULL, threadC, NULL); 56 pthread_join(tida, NULL); 57 pthread_join(tidb, NULL); 58 pthread_join(tidc, NULL); 59 return 0; 60 }