pthread_mutex_init
头文件:
#include <pthread.h>
函数原型:
int pthread_mutex_init(pthread_mutex_t *restrict_mutex,const pthread_mutexattr_t *restrict_attr);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
示例对比
下面代码是创建了两个现象,线程1对全局变量gnum自增3次,线程2对其自增5次
1:未使用线程锁得情况
/*************************************************************************
> File Name: pthread.c
> Author: kayshi
> Mail: kayshi2019@qq.com
> Created Time: Mon 21 Sep 2020 03:12:09 PM CST
************************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
int gnum = 0;
static void thread_fun1(void)
{
int i = 0;
for (i = 0; i < 3; i++)
{
printf("this is thread1\n");
sleep(1);
gnum++;
printf("thread1 add one to num %d\n", gnum);
}
}
static void thread_fun2(void)
{
int i = 0;
for (i = 0; i < 5; i++)
{
printf("this is thread2\n");
sleep(1);
gnum++;
printf("thread2 add one to num %d\n", gnum);
}
}
int main()
{
pthread_t id1, id2;
printf("start\n");
pthread_create(&id1, NULL, (void *)thread_fun1, NULL);
pthread_create(&id2, NULL, (void *)thread_fun2, NULL);
pthread_join(id1, NULL);
pthread_join(id2, NULL);
printf("end\n");
}
通过上面发现,线程1和线程2会交替着对全局变量递增,属于不可控制得状态
2:添加线程锁
/*************************************************************************
> File Name: pthread.c
> Author: kayshi
> Mail: kayshi2019@qq.com
> Created Time: Mon 21 Sep 2020 03:12:09 PM CST
************************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
int gnum = 0;
pthread_mutex_t mutex;
static void thread_fun1(void)
{
int i = 0;
for (i = 0; i < 3; i++)
{
pthread_mutex_lock(&mutex);
printf("this is thread1\n");
sleep(1);
gnum++;
printf("thread1 add one to num %d\n", gnum);
pthread_mutex_unlock(&mutex);
}
}
static void thread_fun2(void)
{
int i = 0;
for (i = 0; i < 5; i++)
{
pthread_mutex_lock(&mutex);
printf("this is thread2\n");
sleep(1);
gnum++;
printf("thread2 add one to num %d\n", gnum);
pthread_mutex_unlock(&mutex);
}
}
int main()
{
pthread_t id1, id2;
printf("start\n");
pthread_mutex_init(&mutex, NULL);
pthread_create(&id1, NULL, (void *)thread_fun1, NULL);
pthread_create(&id2, NULL, (void *)thread_fun2, NULL);
pthread_join(id1, NULL);
pthread_join(id2, NULL);
printf("end\n");
}
通过上面得现象发现,线程2先对变量递增,然后线程1再对变量递增。
线程锁得作用就在于,当一个线程获取锁执行后,另一个也需要获得该锁得线程就会阻塞等待这个锁得释放然后才能得以执行。