一、介绍
对于多线程来说,线程的执行顺序并不是固定的,无法预料哪个线程先执行哪个线程后执行,所以需要一种同步机制,另外,不同的线程访问同一个公共区域,如果这个公共区域同一时刻只能被一个线程访问,这个时候也需要一个机制协调不同线程,这里就有了我们的互斥锁
二、互斥锁相关函数
#include <pthread.h>
pthread_mutex_t lock; /* 互斥锁定义 */
pthread_mutex_init(&lock, NULL); /* 动态初始化, 成功返回0,失败返回非0 */
pthread_mutex_t thread_mutex = PTHREAD_MUTEX_INITIALIZER; /* 静态初始化 */
pthread_mutex_lock(&lock); /* 阻塞的锁定互斥锁 */
pthread_mutex_trylock(&thread_mutex);/* 非阻塞的锁定互斥锁,成功获得互斥锁返回0,如果未能获得互斥锁,立即返回一个错误码 */
pthread_mutex_unlock(&lock); /* 解锁互斥锁 */
pthread_mutex_destroy(&lock) /* 销毁互斥锁 */
使用流程
1、创建互斥锁
2、加锁
3、解锁
4、销毁互斥锁
三、使用
1、不带互斥锁的线程
#include <pthread.h>
#include <stdio.h>
void *print_msg(void *arg){
int i=0;
for(i=0;i<5;i++){
printf("output : %d\n",i);
usleep(100);
}
}
void *print_msg1(void *arg){
int i=0;
for(i=0;i<5;i++){
printf("output : %d\n",i);
usleep(100);
}
}
int main(int argc,char** argv)
{
pthread_t id1;
pthread_t id2;
pthread_create(&id1,NULL,print_msg,NULL);
pthread_create(&id2,NULL,print_msg1,NULL);
pthread_join(id1,NULL);
pthread_join(id2,NULL);
return 1;
}
2、带互斥锁的线程
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t mutex;
void *print_msg(void *arg)
{
int i=0;
pthread_mutex_lock(&mutex);
for(i=0;i<5;i++)
{
printf("output : %d\n",i);
usleep(100);
}
pthread_mutex_unlock(&mutex);
}
void *print_msg1(void *arg)
{
int i=0;
pthread_mutex_lock(&mutex);
for(i=0;i<5;i++)
{
printf("output : %d\n",i);
usleep(100);
}
pthread_mutex_unlock(&mutex);
}
int main(int argc,char** argv)
{
pthread_t id1;
pthread_t id2;
pthread_mutex_init(&mutex,NULL);
pthread_create(&id1,NULL,print_msg,NULL);
pthread_create(&id2,NULL,print_msg1,NULL);
pthread_join(id1,NULL);
pthread_join(id2,NULL);
pthread_mutex_destroy(&mutex);
return 1;
}