1、互斥锁(mutex)
通过锁机制实现线程间的同步。同一时刻只允许一个线程执行一个关键部分的代码。
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);
int pthread_mutex_lock(pthread_mutex *mutex);
int pthread_mutex_destroy(pthread_mutex *mutex);
int pthread_mutex_unlock(pthread_mutex *
(1)先初始化锁init()或静态赋值pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIER
attr_t有:
PTHREAD_MUTEX_TIMED_NP:其余线程等待队列
PTHREAD_MUTEX_RECURSIVE_NP:嵌套锁,允许线程多次加锁,不同线程,解锁后重新竞争
PTHREAD_MUTEX_ERRORCHECK_NP:检错,与一同,线程请求已用锁,返回EDEADLK;
PTHREAD_MUTEX_ADAPTIVE_NP:适应锁,解锁后重新竞争
(2)加锁,lock,trylock,lock阻塞等待锁,trylock立即返回EBUSY
(3)解锁,unlock需满足是加锁状态,且由加锁线程解锁
(4)清除锁,destroy(此时锁必需unlock,否则返回EBUSY,//Linux下互斥锁不占用内存资源
2、实例及运行结果
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int tmp;
void* thread1(void *arg)
{
printf("thread id is %d\n",pthread_self());
pthread_mutex_lock(&mutex);
tmp = 1;
printf("Now a is %d\n",tmp);
pthread_mutex_unlock(&mutex);
return NULL;
}
void* thread2(void *arg)
{
printf("thread id is %d\n",pthread_self());
pthread_mutex_lock(&mutex);
tmp = 2;
printf("Now a is %d\n",tmp);
pthread_mutex_unlock(&mutex);
return NULL;
}
int main()
{
pthread_t id1;
pthread_t id2;
printf("main thread id is %d\n", pthread_self() );
tmp = 3;
printf("In main func tmp = %d\n", tmp);;
if (!pthread_create(&id1, NULL, thread1, NULL))
{
printf( "Create thread success!\n");
}
if (!pthread_create(&id2, NULL, thread2, NULL))
{
printf( "Create thread success!\n");
}
sleep(1);
pthread_join(id1, NULL);
pthread_join(id2, NULL);
pthread_mutex_destroy(&mutex);
return 0;
}
gcc -o mutex mutex.c -lpthread;./mutex
执行结果如下:
main thread id is -1568364736
In main func tmp = 3
Create thread success!
thread id is -1568368896
Now a is 1
Create thread success!
thread id is -1576761600
Now a is 2