本文主要是介绍操作系统互斥锁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
互斥锁
注意:如果man手册中查不到这系列函数,可以安装以下内容:sudo apt-get install glibc-docsudo apt-get install manpages-posix-devpthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
功能:定义并初始化互斥锁int pthread_mutex_init (pthread_mutex_t* mutex,const pthread_mutexattr_t* mutexattr);
功能:初始化一互斥锁,会被初始化为非锁定状态
int pthread_mutex_lock (pthread_mutex_t* mutex);
功能:加锁,当互斥锁已经是锁定状态时,调用者会阻塞,直到互斥被解开,当前线程才会加锁成功并返回。
int pthread_mutex_unlock (pthread_mutex_t* mutex);
功能:解锁,解锁后等待加锁的线程才能加锁成功。
int pthread_mutex_destroy (pthread_mutex_t* mutex);
功能:销毁锁int pthread_mutex_trylock (pthread_mutex_t *__mutex)
功能:加测试锁,如果不加锁刚立即返回
int pthread_mutex_timedlock(pthread_mutex_t *restrict mutex,const struct timespec *restrict abs_timeout);
功能:倒计时加锁,如果超时还不加上则立即返回。
struct timespec{time_t tv_sec; /* Seconds. */long int tv_nsec; /* Nanoseconds.*/ 1秒= 1000000000 纳秒
};
#include <stdio.h>
#include <pthread.h>
/*
执行流程:1、互斥锁被初始化为非锁定状态2、线程1调用pthread_mutex_lock函数,立即返回,互斥量呈锁定状态;3、线程2调用pthread_mutex_lock函数,阻塞等待;4、线程1调用pthread_mutex_unlock函数,互斥量呈非锁定状态;5、线程2被唤醒,从pthread_mutex_lock函数中返回,互斥量呈锁定状态
*/
pthread_mutex_t mutex;
//pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int num = 0;
void* run(void* arg)
{for(int i=0; i<1000000; i++){pthread_mutex_lock(&mutex);num++;pthread_mutex_unlock(&mutex);}
}
int main(int argc,const char* argv[])
{pthread_mutex_init(&mutex,NULL);pthread_t pid1,pid2;pthread_create(&pid1,NULL,run,NULL);pthread_create(&pid2,NULL,run,NULL);pthread_join(pid1,NULL);pthread_join(pid2,NULL);pthread_mutex_destroy(&mutex);printf("%d\n",num);
}
这篇关于操作系统互斥锁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!